@@ -63,6 +63,11 @@ func TestCompileOfProblematicSketches(t *testing.T) {
63
63
_ , _ , err = cli .Run ("lib" , "install" , "CapacitiveSensor@0.5" )
64
64
require .NoError (t , err )
65
65
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
+
66
71
integrationtest.CLISubtests {
67
72
{"SketchWithInlineFunction" , testBuilderSketchWithInlineFunction },
68
73
{"SketchWithConst" , testBuilderSketchWithConst },
@@ -97,6 +102,8 @@ func TestCompileOfProblematicSketches(t *testing.T) {
97
102
{"SketchWithFunctionPointer" , tryBuildAvrLeonardo },
98
103
{"USBHostExample" , testBuilderUSBHostExample },
99
104
{"SketchWithConflictingLibraries" , testBuilderSketchWithConflictingLibraries },
105
+ {"SketchLibraryProvidesAllIncludes" , testBuilderSketchLibraryProvidesAllIncludes },
106
+ {"UserHardware" , testBuilderWithUserHardware },
100
107
}.Run (t , env , cli )
101
108
}
102
109
@@ -322,8 +329,12 @@ func testBuilderBridgeExample(t *testing.T, env *integrationtest.Environment, cl
322
329
require .True (t , buildPath .Join ("BridgeExample.ino.hex" ).Exist ())
323
330
require .True (t , buildPath .Join ("libraries" , "Bridge" , "Mailbox.cpp.o" ).Exist ())
324
331
332
+ libs := out .BuilderResult .UsedLibraries
333
+ require .Len (t , libs , 1 )
334
+ require .Equal (t , "Bridge" , libs [0 ].Name )
335
+
325
336
// 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 } )
327
338
require .NoError (t , err2 )
328
339
buildPath2 := out2 .BuilderResult .BuildPath
329
340
require .True (t , buildPath2 .Join ("core" , "HardwareSerial.cpp.o" ).Exist ())
@@ -335,7 +346,7 @@ func testBuilderBridgeExample(t *testing.T, env *integrationtest.Environment, cl
335
346
336
347
t .Run ("BuildForSAM" , func (t * testing.T ) {
337
348
// 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 } )
339
350
require .NoError (t , err )
340
351
341
352
buildPath := out .BuilderResult .BuildPath
@@ -358,7 +369,7 @@ func testBuilderBridgeExample(t *testing.T, env *integrationtest.Environment, cl
358
369
359
370
t .Run ("BuildForRedBearAVR" , func (t * testing.T ) {
360
371
// 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 } )
362
373
require .NoError (t , err )
363
374
buildPath := out .BuilderResult .BuildPath
364
375
require .True (t , buildPath .Join ("core" , "HardwareSerial.cpp.o" ).Exist ())
@@ -377,7 +388,7 @@ func testBuilderBridgeExample(t *testing.T, env *integrationtest.Environment, cl
377
388
require .NoError (t , buildPath .Join ("libraries" , "SPI" ).MkdirAll ())
378
389
379
390
// 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 } )
381
392
require .NoError (t , err )
382
393
383
394
require .False (t , buildPath .Join ("libraries" , "SPI" ).Exist ())
@@ -548,6 +559,52 @@ func testBuilderSketchWithConflictingLibraries(t *testing.T, env *integrationtes
548
559
})
549
560
}
550
561
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
+
551
608
func tryBuildAvrLeonardo (t * testing.T , env * integrationtest.Environment , cli * integrationtest.ArduinoCLI ) {
552
609
_ , err := tryBuild (t , env , cli , "arduino:avr:leonardo" )
553
610
require .NoError (t , err )
@@ -568,25 +625,49 @@ type builderLibrary struct {
568
625
SourceDir * paths.Path `json:"source_dir"`
569
626
}
570
627
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
+ }
577
651
args := []string {
578
652
"compile" ,
579
653
"-b" , fqbn ,
580
- "--libraries" , libsPath .String (),
581
654
"--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 {
584
665
args = append (args , "--clean" )
585
666
}
586
- if slices . Contains ( options , "all-warnings" ) {
667
+ if options . AllWarnings {
587
668
args = append (args , "--warnings" , "all" )
588
669
}
589
- if slices . Contains ( options , "verbose" ) {
670
+ if options . Verbose {
590
671
args = append (args , "-v" )
591
672
}
592
673
jsonOut , _ , err := cli .Run (args ... )
0 commit comments