@@ -63,6 +63,11 @@ func TestCompileOfProblematicSketches(t *testing.T) {
6363 _ , _ , err = cli .Run ("lib" , "install" , "CapacitiveSensor@0.5" )
6464 require .NoError (t , err )
6565
66+ // Install custom hardware required for tests
67+ customHwDir , err := paths .New ("testdata" , "user_hardware" ).Abs ()
68+ require .NoError (t , err )
69+ require .NoError (t , customHwDir .CopyDirTo (cli .SketchbookDir ().Join ("hardware" )))
70+
6671 integrationtest.CLISubtests {
6772 {"SketchWithInlineFunction" , testBuilderSketchWithInlineFunction },
6873 {"SketchWithConst" , testBuilderSketchWithConst },
@@ -97,6 +102,8 @@ func TestCompileOfProblematicSketches(t *testing.T) {
97102 {"SketchWithFunctionPointer" , tryBuildAvrLeonardo },
98103 {"USBHostExample" , testBuilderUSBHostExample },
99104 {"SketchWithConflictingLibraries" , testBuilderSketchWithConflictingLibraries },
105+ {"SketchLibraryProvidesAllIncludes" , testBuilderSketchLibraryProvidesAllIncludes },
106+ {"UserHardware" , testBuilderWithUserHardware },
100107 }.Run (t , env , cli )
101108}
102109
@@ -322,8 +329,12 @@ func testBuilderBridgeExample(t *testing.T, env *integrationtest.Environment, cl
322329 require .True (t , buildPath .Join ("BridgeExample.ino.hex" ).Exist ())
323330 require .True (t , buildPath .Join ("libraries" , "Bridge" , "Mailbox.cpp.o" ).Exist ())
324331
332+ libs := out .BuilderResult .UsedLibraries
333+ require .Len (t , libs , 1 )
334+ require .Equal (t , "Bridge" , libs [0 ].Name )
335+
325336 // Build again...
326- out2 , err2 := tryBuild (t , env , cli , "arduino:avr:leonardo" , "no-clean" )
337+ out2 , err2 := tryBuild (t , env , cli , "arduino:avr:leonardo" , & buildOptions { NoClean : true } )
327338 require .NoError (t , err2 )
328339 buildPath2 := out2 .BuilderResult .BuildPath
329340 require .True (t , buildPath2 .Join ("core" , "HardwareSerial.cpp.o" ).Exist ())
@@ -335,7 +346,7 @@ func testBuilderBridgeExample(t *testing.T, env *integrationtest.Environment, cl
335346
336347 t .Run ("BuildForSAM" , func (t * testing.T ) {
337348 // Build again for SAM...
338- out , err := tryBuild (t , env , cli , "arduino:sam:arduino_due_x_dbg" , "all-warnings" )
349+ out , err := tryBuild (t , env , cli , "arduino:sam:arduino_due_x_dbg" , & buildOptions { AllWarnings : true } )
339350 require .NoError (t , err )
340351
341352 buildPath := out .BuilderResult .BuildPath
@@ -358,7 +369,7 @@ func testBuilderBridgeExample(t *testing.T, env *integrationtest.Environment, cl
358369
359370 t .Run ("BuildForRedBearAVR" , func (t * testing.T ) {
360371 // Build again for RedBearLab...
361- out , err := tryBuild (t , env , cli , "RedBear:avr:blend" , "verbose" )
372+ out , err := tryBuild (t , env , cli , "RedBear:avr:blend" , & buildOptions { Verbose : true } )
362373 require .NoError (t , err )
363374 buildPath := out .BuilderResult .BuildPath
364375 require .True (t , buildPath .Join ("core" , "HardwareSerial.cpp.o" ).Exist ())
@@ -377,7 +388,7 @@ func testBuilderBridgeExample(t *testing.T, env *integrationtest.Environment, cl
377388 require .NoError (t , buildPath .Join ("libraries" , "SPI" ).MkdirAll ())
378389
379390 // Build again...
380- _ , err = tryBuild (t , env , cli , "arduino:avr:leonardo" , "no-clean" )
391+ _ , err = tryBuild (t , env , cli , "arduino:avr:leonardo" , & buildOptions { NoClean : true } )
381392 require .NoError (t , err )
382393
383394 require .False (t , buildPath .Join ("libraries" , "SPI" ).Exist ())
@@ -548,6 +559,52 @@ func testBuilderSketchWithConflictingLibraries(t *testing.T, env *integrationtes
548559 })
549560}
550561
562+ func testBuilderSketchLibraryProvidesAllIncludes (t * testing.T , env * integrationtest.Environment , cli * integrationtest.ArduinoCLI ) {
563+ t .Run ("Build" , func (t * testing.T ) {
564+ // Build
565+ out , err := tryBuild (t , env , cli , "arduino:avr:leonardo" )
566+ require .NoError (t , err )
567+ libs := out .BuilderResult .UsedLibraries
568+ slices .SortFunc (libs , func (x , y * builderLibrary ) bool { return x .Name < y .Name })
569+ require .Len (t , libs , 2 )
570+ require .Equal (t , "ANewLibrary-master" , libs [0 ].Name )
571+ require .Equal (t , "IRremote" , libs [1 ].Name )
572+ })
573+ }
574+
575+ func testBuilderWithUserHardware (t * testing.T , env * integrationtest.Environment , cli * integrationtest.ArduinoCLI ) {
576+ coreSPILib , err := cli .SketchbookDir ().Join ("hardware" , "my_avr_platform" , "avr" , "libraries" , "SPI" ).Abs ()
577+ require .NoError (t , err )
578+ sketchPath := coreSPILib .Join ("examples" , "BarometricPressureSensor" , "BarometricPressureSensor.ino" )
579+
580+ t .Run ("TestIncludesToIncludeFoldersDuplicateLibs" , func (t * testing.T ) {
581+ out , err := tryBuild (t , env , cli , "my_avr_platform:avr:custom_yun" , & buildOptions {
582+ Sketch : sketchPath ,
583+ NoTestLibraries : true ,
584+ })
585+ require .NoError (t , err )
586+
587+ importedLibraries := out .BuilderResult .UsedLibraries
588+ require .Equal (t , 1 , len (importedLibraries ))
589+ require .Equal (t , "SPI" , importedLibraries [0 ].Name )
590+ require .True (t , importedLibraries [0 ].SourceDir .EquivalentTo (coreSPILib ))
591+ })
592+
593+ t .Run ("TestIncludesToIncludeFoldersDuplicateLibsWithConflictingLibsOutsideOfPlatform" , func (t * testing.T ) {
594+ SPILib , err := paths .New ("testdata" , "libraries" , "SPI" ).Abs ()
595+ require .NoError (t , err )
596+ out , err := tryBuild (t , env , cli , "my_avr_platform:avr:custom_yun" , & buildOptions {
597+ Sketch : sketchPath ,
598+ })
599+ require .NoError (t , err )
600+
601+ importedLibraries := out .BuilderResult .UsedLibraries
602+ require .Equal (t , 1 , len (importedLibraries ))
603+ require .Equal (t , "SPI" , importedLibraries [0 ].Name )
604+ require .True (t , importedLibraries [0 ].SourceDir .EquivalentTo (SPILib ))
605+ })
606+ }
607+
551608func tryBuildAvrLeonardo (t * testing.T , env * integrationtest.Environment , cli * integrationtest.ArduinoCLI ) {
552609 _ , err := tryBuild (t , env , cli , "arduino:avr:leonardo" )
553610 require .NoError (t , err )
@@ -568,25 +625,49 @@ type builderLibrary struct {
568625 SourceDir * paths.Path `json:"source_dir"`
569626}
570627
571- func tryBuild (t * testing.T , env * integrationtest.Environment , cli * integrationtest.ArduinoCLI , fqbn string , options ... string ) (* builderOutput , error ) {
572- subTestName := strings .Split (t .Name (), "/" )[1 ]
573- sketchPath , err := paths .New ("testdata" , subTestName ).Abs ()
574- require .NoError (t , err )
575- libsPath , err := paths .New ("testdata" , "libraries" ).Abs ()
576- require .NoError (t , err )
628+ type buildOptions struct {
629+ Sketch * paths.Path
630+ NoTestLibraries bool
631+ CustomLibPath * paths.Path
632+ NoClean bool
633+ AllWarnings bool
634+ Verbose bool
635+ }
636+
637+ func tryBuild (t * testing.T , env * integrationtest.Environment , cli * integrationtest.ArduinoCLI , fqbn string , optionsArg ... * buildOptions ) (* builderOutput , error ) {
638+ var options * buildOptions
639+ if len (optionsArg ) == 0 {
640+ options = & buildOptions {}
641+ } else {
642+ require .Len (t , optionsArg , 1 )
643+ options = optionsArg [0 ]
644+ }
645+ if options .Sketch == nil {
646+ subTestName := strings .Split (t .Name (), "/" )[1 ]
647+ sketchPath , err := paths .New ("testdata" , subTestName ).Abs ()
648+ require .NoError (t , err )
649+ options .Sketch = sketchPath
650+ }
577651 args := []string {
578652 "compile" ,
579653 "-b" , fqbn ,
580- "--libraries" , libsPath .String (),
581654 "--format" , "json" ,
582- sketchPath .String ()}
583- if ! slices .Contains (options , "no-clean" ) {
655+ options .Sketch .String ()}
656+ if ! options .NoTestLibraries {
657+ libsPath , err := paths .New ("testdata" , "libraries" ).Abs ()
658+ require .NoError (t , err )
659+ args = append (args , "--libraries" , libsPath .String ())
660+ }
661+ if options .CustomLibPath != nil {
662+ args = append (args , "--library" , options .CustomLibPath .String ())
663+ }
664+ if ! options .NoClean {
584665 args = append (args , "--clean" )
585666 }
586- if slices . Contains ( options , "all-warnings" ) {
667+ if options . AllWarnings {
587668 args = append (args , "--warnings" , "all" )
588669 }
589- if slices . Contains ( options , "verbose" ) {
670+ if options . Verbose {
590671 args = append (args , "-v" )
591672 }
592673 jsonOut , _ , err := cli .Run (args ... )
0 commit comments