From 43d385b8772a13277631b30318d309ec3080bcdc Mon Sep 17 00:00:00 2001
From: per1234 <accounts@perglass.com>
Date: Sun, 12 Mar 2023 19:57:40 -0700
Subject: [PATCH 1/2] Improve test coverage of SS002 rule function

Previously the test data for the unit tests of this function did not provide full coverage of all valid sketch filename
formats.
---
 internal/rule/rulefunction/sketch_test.go                       | 2 +-
 .../sketches/AllowedCharactersInFilenames/1LeadingNumber.ino    | 0
 .../AllowedCharactersInFilenames.ino                            | 2 ++
 .../sketches/AllowedCharactersInFilenames/Contains-Hyphen.ino   | 0
 .../sketches/AllowedCharactersInFilenames/Contains.Dot.ino      | 0
 .../sketches/AllowedCharactersInFilenames/ContainsNumber1.ino   | 0
 .../AllowedCharactersInFilenames/Contains_Underscore.ino        | 0
 7 files changed, 3 insertions(+), 1 deletion(-)
 create mode 100644 internal/rule/rulefunction/testdata/sketches/AllowedCharactersInFilenames/1LeadingNumber.ino
 create mode 100644 internal/rule/rulefunction/testdata/sketches/AllowedCharactersInFilenames/AllowedCharactersInFilenames.ino
 create mode 100644 internal/rule/rulefunction/testdata/sketches/AllowedCharactersInFilenames/Contains-Hyphen.ino
 create mode 100644 internal/rule/rulefunction/testdata/sketches/AllowedCharactersInFilenames/Contains.Dot.ino
 create mode 100644 internal/rule/rulefunction/testdata/sketches/AllowedCharactersInFilenames/ContainsNumber1.ino
 create mode 100644 internal/rule/rulefunction/testdata/sketches/AllowedCharactersInFilenames/Contains_Underscore.ino

diff --git a/internal/rule/rulefunction/sketch_test.go b/internal/rule/rulefunction/sketch_test.go
index fa910d13..d873b0e0 100644
--- a/internal/rule/rulefunction/sketch_test.go
+++ b/internal/rule/rulefunction/sketch_test.go
@@ -75,7 +75,7 @@ func TestSketchNameMismatch(t *testing.T) {
 func TestProhibitedCharactersInSketchFileName(t *testing.T) {
 	testTables := []sketchRuleFunctionTestTable{
 		{"Has prohibited characters", "ProhibitedCharactersInFileName", ruleresult.Fail, "^Prohibited CharactersInFileName.h$"},
-		{"No prohibited characters", "Valid", ruleresult.Pass, ""},
+		{"No prohibited characters", "AllowedCharactersInFilenames", ruleresult.Pass, ""},
 	}
 
 	checkSketchRuleFunction(ProhibitedCharactersInSketchFileName, testTables, t)
diff --git a/internal/rule/rulefunction/testdata/sketches/AllowedCharactersInFilenames/1LeadingNumber.ino b/internal/rule/rulefunction/testdata/sketches/AllowedCharactersInFilenames/1LeadingNumber.ino
new file mode 100644
index 00000000..e69de29b
diff --git a/internal/rule/rulefunction/testdata/sketches/AllowedCharactersInFilenames/AllowedCharactersInFilenames.ino b/internal/rule/rulefunction/testdata/sketches/AllowedCharactersInFilenames/AllowedCharactersInFilenames.ino
new file mode 100644
index 00000000..660bdbcc
--- /dev/null
+++ b/internal/rule/rulefunction/testdata/sketches/AllowedCharactersInFilenames/AllowedCharactersInFilenames.ino
@@ -0,0 +1,2 @@
+void setup() {}
+void loop() {}
diff --git a/internal/rule/rulefunction/testdata/sketches/AllowedCharactersInFilenames/Contains-Hyphen.ino b/internal/rule/rulefunction/testdata/sketches/AllowedCharactersInFilenames/Contains-Hyphen.ino
new file mode 100644
index 00000000..e69de29b
diff --git a/internal/rule/rulefunction/testdata/sketches/AllowedCharactersInFilenames/Contains.Dot.ino b/internal/rule/rulefunction/testdata/sketches/AllowedCharactersInFilenames/Contains.Dot.ino
new file mode 100644
index 00000000..e69de29b
diff --git a/internal/rule/rulefunction/testdata/sketches/AllowedCharactersInFilenames/ContainsNumber1.ino b/internal/rule/rulefunction/testdata/sketches/AllowedCharactersInFilenames/ContainsNumber1.ino
new file mode 100644
index 00000000..e69de29b
diff --git a/internal/rule/rulefunction/testdata/sketches/AllowedCharactersInFilenames/Contains_Underscore.ino b/internal/rule/rulefunction/testdata/sketches/AllowedCharactersInFilenames/Contains_Underscore.ino
new file mode 100644
index 00000000..e69de29b

From fa2d53eb47af0e74055fb4f0660c260563d0fbf7 Mon Sep 17 00:00:00 2001
From: per1234 <accounts@perglass.com>
Date: Sun, 12 Mar 2023 20:03:07 -0700
Subject: [PATCH 2/2] Allow leading underscore in sketch filenames

The Arduino Sketch Specification defines the allowed format of sketch folder names and sketch code filenames. Arduino
Lint's rule SS002 checks compliance with the specification.

The Arduino Sketch Specification has been changed to allow a leading underscore in sketch folder names and sketch code
filenames so the Arduino Lint rule code must be updated accordingly.
---
 internal/rule/rulefunction/rulefunction.go                      | 2 +-
 .../AllowedCharactersInFilenames/_LeadingUnderscore.ino         | 0
 2 files changed, 1 insertion(+), 1 deletion(-)
 create mode 100644 internal/rule/rulefunction/testdata/sketches/AllowedCharactersInFilenames/_LeadingUnderscore.ino

diff --git a/internal/rule/rulefunction/rulefunction.go b/internal/rule/rulefunction/rulefunction.go
index 9659b78e..aebd745b 100644
--- a/internal/rule/rulefunction/rulefunction.go
+++ b/internal/rule/rulefunction/rulefunction.go
@@ -105,7 +105,7 @@ func brokenOutputList(list []string) string {
 
 // validProjectPathBaseName checks whether the provided library folder or sketch filename contains prohibited characters.
 func validProjectPathBaseName(name string) bool {
-	baseNameRegexp := regexp.MustCompile("^[a-zA-Z0-9][a-zA-Z0-9_.-]*$")
+	baseNameRegexp := regexp.MustCompile("^[a-zA-Z0-9_][a-zA-Z0-9_.-]*$")
 	return baseNameRegexp.MatchString(name)
 }
 
diff --git a/internal/rule/rulefunction/testdata/sketches/AllowedCharactersInFilenames/_LeadingUnderscore.ino b/internal/rule/rulefunction/testdata/sketches/AllowedCharactersInFilenames/_LeadingUnderscore.ino
new file mode 100644
index 00000000..e69de29b