diff --git a/scripts/checkCommits1by1.fsx b/scripts/checkCommits1by1.fsx
index 5641260f0..4475d6304 100755
--- a/scripts/checkCommits1by1.fsx
+++ b/scripts/checkCommits1by1.fsx
@@ -10,7 +10,7 @@ open System.Net.Http.Headers
#r "nuget: FSharp.Data, Version=5.0.2"
open FSharp.Data
-#r "nuget: Fsdk, Version=0.6.0--date20230214-0422.git-1ea6f62"
+#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853"
open Fsdk
open Fsdk.Process
diff --git a/scripts/compileFSharpScripts.fsx b/scripts/compileFSharpScripts.fsx
index 09fd0d5e9..6eff0616f 100755
--- a/scripts/compileFSharpScripts.fsx
+++ b/scripts/compileFSharpScripts.fsx
@@ -3,7 +3,7 @@
open System
open System.IO
-#r "nuget: Fsdk, Version=0.6.0--date20230214-0422.git-1ea6f62"
+#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853"
#load "../src/FileConventions/Helpers.fs"
Fsdk
diff --git a/scripts/dotnetFileConventions.fsx b/scripts/dotnetFileConventions.fsx
new file mode 100755
index 000000000..790a0dfad
--- /dev/null
+++ b/scripts/dotnetFileConventions.fsx
@@ -0,0 +1,80 @@
+#!/usr/bin/env -S dotnet fsi
+
+open System
+open System.IO
+open System.Text.RegularExpressions
+
+#r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1"
+#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853"
+#r "nuget: YamlDotNet, Version=16.1.3"
+
+open Fsdk
+open Fsdk.Process
+
+#load "../src/FileConventions/Helpers.fs"
+#load "../src/FileConventions/Library.fs"
+
+open FileConventions
+open Helpers
+
+let args = Misc.FsxOnlyArguments()
+
+if args.Length > 1 then
+ Console.Error.WriteLine
+ "Usage: dotnetFileConventions.fsx [projectFolder(optional)]"
+
+ Environment.Exit 1
+
+let rootDir = DirectoryInfo args.[0]
+
+// DefiningEmptyStringsWithDoubleQuotes
+let allSourceFiles = ReturnAllProjectSourceFiles rootDir [ "*.cs"; "*.fs" ] true
+printfn "%A" (String.Join("\n", allSourceFiles))
+
+let allProjFiles =
+ ReturnAllProjectSourceFiles rootDir [ "*.csproj"; "*.fsproj" ] true
+
+for sourceFile in allSourceFiles do
+ let isStringEmpty = DefiningEmptyStringsWithDoubleQuotes sourceFile
+
+ if isStringEmpty then
+ failwith(
+ sprintf
+ "%s file: Contains empty strings specifed with \"\" , you should use String.Empty()"
+ sourceFile.FullName
+ )
+
+
+// ProjFilesNamingConvention
+
+for projfile in allProjFiles do
+ let isWrongProjFile = ProjFilesNamingConvention projfile
+
+ if isWrongProjFile then
+ failwith(
+ sprintf
+ "%s file: Project file or Project directory is incorrect!\n
+ Fix: use same name on .csproj/.fsproj on parrent project directory"
+ projfile.FullName
+ )
+
+// notfollowingnamespaceconvention
+for sourcefile in allSourceFiles do
+ let iswrongnamespace = NotFollowingNamespaceConvention sourcefile
+
+ if iswrongnamespace then
+ failwith(sprintf "%s file: has wrong namespace!" sourcefile.FullName)
+
+// NotFollowingConsoleAppConvention
+for projfile in allProjFiles do
+ let isWrongConsoleApplication =
+ NotFollowingConsoleAppConvention projfile true
+
+ printfn "%A" projfile
+
+ if isWrongConsoleApplication then
+ failwith(
+ sprintf
+ "%s project: Should not contain console methods or printf"
+ projfile.FullName
+ )
diff --git a/scripts/eofConvention.fsx b/scripts/eofConvention.fsx
index fee536187..fe5c5364e 100755
--- a/scripts/eofConvention.fsx
+++ b/scripts/eofConvention.fsx
@@ -5,6 +5,7 @@ open System
#r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1"
#r "nuget: YamlDotNet, Version=16.1.3"
+#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853"
#load "../src/FileConventions/Helpers.fs"
#load "../src/FileConventions/Library.fs"
diff --git a/scripts/executableConvention.fsx b/scripts/executableConvention.fsx
index 365552de0..c7e67d0eb 100755
--- a/scripts/executableConvention.fsx
+++ b/scripts/executableConvention.fsx
@@ -5,8 +5,9 @@ open System.IO
#r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1"
#r "nuget: YamlDotNet, Version=16.1.3"
-#load "../src/FileConventions/Library.fs"
+#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853"
#load "../src/FileConventions/Helpers.fs"
+#load "../src/FileConventions/Library.fs"
let rootDir = Path.Combine(__SOURCE_DIRECTORY__, "..") |> DirectoryInfo
let currentDir = Directory.GetCurrentDirectory() |> DirectoryInfo
diff --git a/scripts/gitPush1by1.fsx b/scripts/gitPush1by1.fsx
index c336cfc12..58ace0fd6 100755
--- a/scripts/gitPush1by1.fsx
+++ b/scripts/gitPush1by1.fsx
@@ -8,7 +8,7 @@ open System.Threading
#r "System.Configuration"
open System.Configuration
-#r "nuget: Fsdk, Version=0.6.0--date20230214-0422.git-1ea6f62"
+#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853"
open Fsdk
open Fsdk.Process
diff --git a/scripts/inconsistentNugetVersionsInDotNetProjects.fsx b/scripts/inconsistentNugetVersionsInDotNetProjects.fsx
index 27e53a6fb..906b2c89e 100755
--- a/scripts/inconsistentNugetVersionsInDotNetProjects.fsx
+++ b/scripts/inconsistentNugetVersionsInDotNetProjects.fsx
@@ -6,7 +6,7 @@ open System.IO
#r "System.Core.dll"
#r "System.Xml.Linq.dll"
-#r "nuget: Fsdk, Version=0.6.0--date20230214-0422.git-1ea6f62"
+#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853"
open Fsdk
diff --git a/scripts/inconsistentNugetVersionsInDotNetProjectsAndFSharpScripts.fsx b/scripts/inconsistentNugetVersionsInDotNetProjectsAndFSharpScripts.fsx
index 55110affc..db22fa703 100755
--- a/scripts/inconsistentNugetVersionsInDotNetProjectsAndFSharpScripts.fsx
+++ b/scripts/inconsistentNugetVersionsInDotNetProjectsAndFSharpScripts.fsx
@@ -5,13 +5,13 @@ open System.IO
#r "System.Core.dll"
#r "System.Xml.Linq.dll"
-#r "nuget: Fsdk, Version=0.6.0--date20230214-0422.git-1ea6f62"
+#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853"
#r "nuget: Microsoft.Build, Version=16.11.0"
#r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1"
#r "nuget: YamlDotNet, Version=16.1.3"
-#load "../src/FileConventions/Library.fs"
#load "../src/FileConventions/Helpers.fs"
+#load "../src/FileConventions/Library.fs"
#load "../src/FileConventions/NugetVersionsCheck.fs"
#load "../src/FileConventions/CombinedVersionCheck.fs"
diff --git a/scripts/inconsistentNugetVersionsInFSharpScripts.fsx b/scripts/inconsistentNugetVersionsInFSharpScripts.fsx
index 5458c12e7..8018b2f6d 100755
--- a/scripts/inconsistentNugetVersionsInFSharpScripts.fsx
+++ b/scripts/inconsistentNugetVersionsInFSharpScripts.fsx
@@ -5,9 +5,10 @@ open System.Linq
#r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1"
#r "nuget: YamlDotNet, Version=16.1.3"
+#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853"
-#load "../src/FileConventions/Library.fs"
#load "../src/FileConventions/Helpers.fs"
+#load "../src/FileConventions/Library.fs"
let rootDir = Path.Combine(__SOURCE_DIRECTORY__, "..") |> DirectoryInfo
let currentDir = Directory.GetCurrentDirectory() |> DirectoryInfo
diff --git a/scripts/inconsistentVersionsInGitHubCI.fsx b/scripts/inconsistentVersionsInGitHubCI.fsx
index 84098ba9f..d0a930a5b 100755
--- a/scripts/inconsistentVersionsInGitHubCI.fsx
+++ b/scripts/inconsistentVersionsInGitHubCI.fsx
@@ -4,9 +4,10 @@ open System.IO
#r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1"
#r "nuget: YamlDotNet, Version=16.1.3"
+#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853"
-#load "../src/FileConventions/Library.fs"
#load "../src/FileConventions/Helpers.fs"
+#load "../src/FileConventions/Library.fs"
let rootDir = Path.Combine(__SOURCE_DIRECTORY__, "..") |> DirectoryInfo
diff --git a/scripts/mixedLineEndings.fsx b/scripts/mixedLineEndings.fsx
index 208b0dca3..cf122dd7b 100755
--- a/scripts/mixedLineEndings.fsx
+++ b/scripts/mixedLineEndings.fsx
@@ -5,9 +5,10 @@ open System.IO
#r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1"
#r "nuget: YamlDotNet, Version=16.1.3"
+#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853"
-#load "../src/FileConventions/Library.fs"
#load "../src/FileConventions/Helpers.fs"
+#load "../src/FileConventions/Library.fs"
let rootDir = Path.Combine(__SOURCE_DIRECTORY__, "..") |> DirectoryInfo
diff --git a/scripts/nonVerboseFlagsInGitHubCIAndScripts.fsx b/scripts/nonVerboseFlagsInGitHubCIAndScripts.fsx
index f89eb79d8..f2f891680 100755
--- a/scripts/nonVerboseFlagsInGitHubCIAndScripts.fsx
+++ b/scripts/nonVerboseFlagsInGitHubCIAndScripts.fsx
@@ -5,9 +5,10 @@ open System.IO
#r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1"
#r "nuget: YamlDotNet, Version=16.1.3"
+#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853"
-#load "../src/FileConventions/Library.fs"
#load "../src/FileConventions/Helpers.fs"
+#load "../src/FileConventions/Library.fs"
let rootDir = Path.Combine(__SOURCE_DIRECTORY__, "..") |> DirectoryInfo
diff --git a/scripts/shebangConvention.fsx b/scripts/shebangConvention.fsx
index ceb39ddff..792c9a6b1 100755
--- a/scripts/shebangConvention.fsx
+++ b/scripts/shebangConvention.fsx
@@ -5,9 +5,10 @@ open System.IO
#r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1"
#r "nuget: YamlDotNet, Version=16.1.3"
+#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853"
-#load "../src/FileConventions/Library.fs"
#load "../src/FileConventions/Helpers.fs"
+#load "../src/FileConventions/Library.fs"
let rootDir = Path.Combine(__SOURCE_DIRECTORY__, "..") |> DirectoryInfo
diff --git a/scripts/unpinnedDotnetToolInstallVersions.fsx b/scripts/unpinnedDotnetToolInstallVersions.fsx
index 304a66dbe..ec6234839 100755
--- a/scripts/unpinnedDotnetToolInstallVersions.fsx
+++ b/scripts/unpinnedDotnetToolInstallVersions.fsx
@@ -5,9 +5,10 @@ open System.IO
#r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1"
#r "nuget: YamlDotNet, Version=16.1.3"
+#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853"
-#load "../src/FileConventions/Library.fs"
#load "../src/FileConventions/Helpers.fs"
+#load "../src/FileConventions/Library.fs"
let rootDir = Path.Combine(__SOURCE_DIRECTORY__, "..") |> DirectoryInfo
diff --git a/scripts/unpinnedGitHubActionsImageVersions.fsx b/scripts/unpinnedGitHubActionsImageVersions.fsx
index 1b30c0a59..d59aabcde 100755
--- a/scripts/unpinnedGitHubActionsImageVersions.fsx
+++ b/scripts/unpinnedGitHubActionsImageVersions.fsx
@@ -5,9 +5,10 @@ open System.IO
#r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1"
#r "nuget: YamlDotNet, Version=16.1.3"
+#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853"
-#load "../src/FileConventions/Library.fs"
#load "../src/FileConventions/Helpers.fs"
+#load "../src/FileConventions/Library.fs"
let rootDir = Path.Combine(__SOURCE_DIRECTORY__, "..") |> DirectoryInfo
diff --git a/scripts/unpinnedNugetPackageReferenceVersionsInFSharpScripts.fsx b/scripts/unpinnedNugetPackageReferenceVersionsInFSharpScripts.fsx
index d48fc1e29..2649b80f2 100755
--- a/scripts/unpinnedNugetPackageReferenceVersionsInFSharpScripts.fsx
+++ b/scripts/unpinnedNugetPackageReferenceVersionsInFSharpScripts.fsx
@@ -5,9 +5,10 @@ open System.IO
#r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1"
#r "nuget: YamlDotNet, Version=16.1.3"
+#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853"
-#load "../src/FileConventions/Library.fs"
#load "../src/FileConventions/Helpers.fs"
+#load "../src/FileConventions/Library.fs"
let rootDir = Path.Combine(__SOURCE_DIRECTORY__, "..") |> DirectoryInfo
diff --git a/scripts/unpinnedNugetPackageReferenceVersionsInProjects.fsx b/scripts/unpinnedNugetPackageReferenceVersionsInProjects.fsx
index 7d3a73f05..b8a34ac54 100755
--- a/scripts/unpinnedNugetPackageReferenceVersionsInProjects.fsx
+++ b/scripts/unpinnedNugetPackageReferenceVersionsInProjects.fsx
@@ -5,9 +5,10 @@ open System.IO
#r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1"
#r "nuget: YamlDotNet, Version=16.1.3"
+#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853"
-#load "../src/FileConventions/Library.fs"
#load "../src/FileConventions/Helpers.fs"
+#load "../src/FileConventions/Library.fs"
let rootDir = Path.Combine(__SOURCE_DIRECTORY__, "..") |> DirectoryInfo
let currentDir = Directory.GetCurrentDirectory() |> DirectoryInfo
diff --git a/scripts/wrapLatestCommitMsg.fsx b/scripts/wrapLatestCommitMsg.fsx
index 8e7f65044..e1aaf4f7b 100755
--- a/scripts/wrapLatestCommitMsg.fsx
+++ b/scripts/wrapLatestCommitMsg.fsx
@@ -7,11 +7,11 @@ open System.Linq
#r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1"
#r "nuget: YamlDotNet, Version=16.1.3"
+#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853"
+#load "../src/FileConventions/Helpers.fs"
#load "../src/FileConventions/Library.fs"
-#r "nuget: Fsdk, Version=0.6.0--date20230214-0422.git-1ea6f62"
-
open Fsdk
open Fsdk.Process
diff --git a/src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithRightName.Console/DummyConsoleProjectWithRightName.Console.fsproj b/src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithRightName.Console/DummyConsoleProjectWithRightName.Console.fsproj
new file mode 100644
index 000000000..299cf40e1
--- /dev/null
+++ b/src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithRightName.Console/DummyConsoleProjectWithRightName.Console.fsproj
@@ -0,0 +1,12 @@
+
+
+
+ Exe
+ net7.0
+
+
+
+
+
+
+
diff --git a/src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithRightName.Console/Program.fs b/src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithRightName.Console/Program.fs
new file mode 100644
index 000000000..543f77ad4
--- /dev/null
+++ b/src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithRightName.Console/Program.fs
@@ -0,0 +1 @@
+printf "Hello World"
diff --git a/src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithWrongName/DummyConsoleProjectWithWrongName.fsproj b/src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithWrongName/DummyConsoleProjectWithWrongName.fsproj
new file mode 100644
index 000000000..299cf40e1
--- /dev/null
+++ b/src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithWrongName/DummyConsoleProjectWithWrongName.fsproj
@@ -0,0 +1,12 @@
+
+
+
+ Exe
+ net7.0
+
+
+
+
+
+
+
diff --git a/src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithWrongName/Program.fs b/src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithWrongName/Program.fs
new file mode 100644
index 000000000..543f77ad4
--- /dev/null
+++ b/src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithWrongName/Program.fs
@@ -0,0 +1 @@
+printf "Hello World"
diff --git a/src/FileConventions.Test/DummyFiles/DummyProjFileWithTheSameNameAsItsParentFolder/DummyProjFileWithTheSameNameAsItsParentFolder.fsproj b/src/FileConventions.Test/DummyFiles/DummyProjFileWithTheSameNameAsItsParentFolder/DummyProjFileWithTheSameNameAsItsParentFolder.fsproj
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/FileConventions.Test/DummyFiles/DummyProject/DummyProjFileWithoutTheSameNameAsItsParentFolder.fsproj b/src/FileConventions.Test/DummyFiles/DummyProject/DummyProjFileWithoutTheSameNameAsItsParentFolder.fsproj
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/FileConventions.Test/DummyFiles/DummyProjectAsync.Console/DummyProjectAsync.Console.fsproj b/src/FileConventions.Test/DummyFiles/DummyProjectAsync.Console/DummyProjectAsync.Console.fsproj
new file mode 100644
index 000000000..299cf40e1
--- /dev/null
+++ b/src/FileConventions.Test/DummyFiles/DummyProjectAsync.Console/DummyProjectAsync.Console.fsproj
@@ -0,0 +1,12 @@
+
+
+
+ Exe
+ net7.0
+
+
+
+
+
+
+
diff --git a/src/FileConventions.Test/DummyFiles/DummyProjectAsync.Console/Program.fs b/src/FileConventions.Test/DummyFiles/DummyProjectAsync.Console/Program.fs
new file mode 100644
index 000000000..6cceb79df
--- /dev/null
+++ b/src/FileConventions.Test/DummyFiles/DummyProjectAsync.Console/Program.fs
@@ -0,0 +1,2 @@
+async { do! Async.Sleep(5000) } |> Async.RunSynchronously
+printf "Hello World"
diff --git a/src/FileConventions.Test/DummyFiles/DummyProjectAsync/DummyProjectAsync.fsproj b/src/FileConventions.Test/DummyFiles/DummyProjectAsync/DummyProjectAsync.fsproj
new file mode 100644
index 000000000..9263cfd62
--- /dev/null
+++ b/src/FileConventions.Test/DummyFiles/DummyProjectAsync/DummyProjectAsync.fsproj
@@ -0,0 +1,12 @@
+
+
+
+ net7.0
+ true
+
+
+
+
+
+
+
diff --git a/src/FileConventions.Test/DummyFiles/DummyProjectAsync/Library.fs b/src/FileConventions.Test/DummyFiles/DummyProjectAsync/Library.fs
new file mode 100644
index 000000000..bf14df5fd
--- /dev/null
+++ b/src/FileConventions.Test/DummyFiles/DummyProjectAsync/Library.fs
@@ -0,0 +1,7 @@
+namespace DummyProjectAsync
+
+module Say =
+
+ let delayedHello name =
+ async { do! Async.Sleep(5000) } |> Async.RunSynchronously
+ "Delayed Hello"
diff --git a/src/FileConventions.Test/DummyFiles/DummyProjectWithRight.Console/DummyProjectWithRight.Console.fsproj b/src/FileConventions.Test/DummyFiles/DummyProjectWithRight.Console/DummyProjectWithRight.Console.fsproj
new file mode 100644
index 000000000..299cf40e1
--- /dev/null
+++ b/src/FileConventions.Test/DummyFiles/DummyProjectWithRight.Console/DummyProjectWithRight.Console.fsproj
@@ -0,0 +1,12 @@
+
+
+
+ Exe
+ net7.0
+
+
+
+
+
+
+
diff --git a/src/FileConventions.Test/DummyFiles/DummyProjectWithRight.Console/Program.fs b/src/FileConventions.Test/DummyFiles/DummyProjectWithRight.Console/Program.fs
new file mode 100644
index 000000000..543f77ad4
--- /dev/null
+++ b/src/FileConventions.Test/DummyFiles/DummyProjectWithRight.Console/Program.fs
@@ -0,0 +1 @@
+printf "Hello World"
diff --git a/src/FileConventions.Test/DummyFiles/DummyProjectWithWrongConsole/DummyProjectWithWrongConsole.fsproj b/src/FileConventions.Test/DummyFiles/DummyProjectWithWrongConsole/DummyProjectWithWrongConsole.fsproj
new file mode 100644
index 000000000..9263cfd62
--- /dev/null
+++ b/src/FileConventions.Test/DummyFiles/DummyProjectWithWrongConsole/DummyProjectWithWrongConsole.fsproj
@@ -0,0 +1,12 @@
+
+
+
+ net7.0
+ true
+
+
+
+
+
+
+
diff --git a/src/FileConventions.Test/DummyFiles/DummyProjectWithWrongConsole/Library.fs b/src/FileConventions.Test/DummyFiles/DummyProjectWithWrongConsole/Library.fs
new file mode 100644
index 000000000..78fab96d2
--- /dev/null
+++ b/src/FileConventions.Test/DummyFiles/DummyProjectWithWrongConsole/Library.fs
@@ -0,0 +1,6 @@
+// printf not accepted here
+namespace DummyProjectWithWrongConsole
+
+module Say =
+ let hello name =
+ printfn "Hello %s" name
diff --git a/src/FileConventions.Test/DummyFiles/DummyScriptWithConventionalEmptyString.fsx b/src/FileConventions.Test/DummyFiles/DummyScriptWithConventionalEmptyString.fsx
new file mode 100644
index 000000000..cc2a7e4ae
--- /dev/null
+++ b/src/FileConventions.Test/DummyFiles/DummyScriptWithConventionalEmptyString.fsx
@@ -0,0 +1,6 @@
+#!/usr/bin/env -S dotnet fsi
+
+open System
+open System.IO
+
+let emptyString = String.Empty
diff --git a/src/FileConventions.Test/DummyFiles/DummyScriptWithEmptyString.fsx b/src/FileConventions.Test/DummyFiles/DummyScriptWithEmptyString.fsx
new file mode 100644
index 000000000..1ae049d82
--- /dev/null
+++ b/src/FileConventions.Test/DummyFiles/DummyScriptWithEmptyString.fsx
@@ -0,0 +1 @@
+let myString = "\"Hello World\""
diff --git a/src/FileConventions.Test/DummyFiles/DummyScriptWithMatchEmptyString.fsx b/src/FileConventions.Test/DummyFiles/DummyScriptWithMatchEmptyString.fsx
new file mode 100644
index 000000000..f8911d757
--- /dev/null
+++ b/src/FileConventions.Test/DummyFiles/DummyScriptWithMatchEmptyString.fsx
@@ -0,0 +1,5 @@
+let temp = "Hello World"
+
+match temp with
+| "" -> failwith "Empty String"
+| _ -> failwith "Non-Empty String"
diff --git a/src/FileConventions.Test/DummyFiles/DummyScriptWithNonConventionalEmptyString.fsx b/src/FileConventions.Test/DummyFiles/DummyScriptWithNonConventionalEmptyString.fsx
new file mode 100644
index 000000000..126e0616a
--- /dev/null
+++ b/src/FileConventions.Test/DummyFiles/DummyScriptWithNonConventionalEmptyString.fsx
@@ -0,0 +1,6 @@
+#!/usr/bin/env -S dotnet fsi
+
+open System
+open System.IO
+
+let emptyString = ""
diff --git a/src/FileConventions.Test/DummyFiles/src/Foo/Bar/DummyFileUnderBarWithRightNamespace.fs b/src/FileConventions.Test/DummyFiles/src/Foo/Bar/DummyFileUnderBarWithRightNamespace.fs
new file mode 100644
index 000000000..7de30ff25
--- /dev/null
+++ b/src/FileConventions.Test/DummyFiles/src/Foo/Bar/DummyFileUnderBarWithRightNamespace.fs
@@ -0,0 +1 @@
+namespace Foo.Bar
diff --git a/src/FileConventions.Test/DummyFiles/src/Foo/Bar/DummyFileUnderBarWithWrongNamespace.fs b/src/FileConventions.Test/DummyFiles/src/Foo/Bar/DummyFileUnderBarWithWrongNamespace.fs
new file mode 100644
index 000000000..b1a3e5451
--- /dev/null
+++ b/src/FileConventions.Test/DummyFiles/src/Foo/Bar/DummyFileUnderBarWithWrongNamespace.fs
@@ -0,0 +1 @@
+namespace Foo.Baz
diff --git a/src/FileConventions.Test/DummyFiles/src/Foo/Bar/DummyFileUnderBarWithWrongNamespace2.fs b/src/FileConventions.Test/DummyFiles/src/Foo/Bar/DummyFileUnderBarWithWrongNamespace2.fs
new file mode 100644
index 000000000..0dda3513d
--- /dev/null
+++ b/src/FileConventions.Test/DummyFiles/src/Foo/Bar/DummyFileUnderBarWithWrongNamespace2.fs
@@ -0,0 +1 @@
+namespace Bar
diff --git a/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithRightNamespace.cs b/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithRightNamespace.cs
new file mode 100644
index 000000000..2f2bebd34
--- /dev/null
+++ b/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithRightNamespace.cs
@@ -0,0 +1,3 @@
+using System;
+
+namespace Foo;
diff --git a/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithRightNamespace.fs b/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithRightNamespace.fs
new file mode 100644
index 000000000..a36e204fc
--- /dev/null
+++ b/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithRightNamespace.fs
@@ -0,0 +1 @@
+namespace Foo
diff --git a/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithWrongNamespace.fs b/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithWrongNamespace.fs
new file mode 100644
index 000000000..9704ca2b7
--- /dev/null
+++ b/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithWrongNamespace.fs
@@ -0,0 +1 @@
+namespace Baz
diff --git a/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithWrongNamespace2.fs b/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithWrongNamespace2.fs
new file mode 100644
index 000000000..d631c774a
--- /dev/null
+++ b/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithWrongNamespace2.fs
@@ -0,0 +1 @@
+namespace FooBuzz
diff --git a/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithoutNamespace.fs b/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithoutNamespace.fs
new file mode 100644
index 000000000..4c7362423
--- /dev/null
+++ b/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithoutNamespace.fs
@@ -0,0 +1 @@
+printf "Hello"
diff --git a/src/FileConventions.Test/FileConventions.Test.fs b/src/FileConventions.Test/FileConventions.Test.fs
index 81d82bc68..f600f736f 100644
--- a/src/FileConventions.Test/FileConventions.Test.fs
+++ b/src/FileConventions.Test/FileConventions.Test.fs
@@ -22,12 +22,12 @@ let dummyFilesDirectory =
[]
let HasCorrectShebangTest1() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyWithoutShebang.fsx"
)
- ))
+ )
Assert.That(HasCorrectShebang fileInfo, Is.EqualTo false)
@@ -35,9 +35,9 @@ let HasCorrectShebangTest1() =
[]
let HasCorrectShebangTest2() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(dummyFilesDirectory.FullName, "DummyWithShebang.fsx")
- ))
+ )
Assert.That(HasCorrectShebang fileInfo, Is.EqualTo true)
@@ -45,12 +45,12 @@ let HasCorrectShebangTest2() =
[]
let HasCorrectShebangTest3() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyWithWrongShebang.fsx"
)
- ))
+ )
Assert.That(HasCorrectShebang fileInfo, Is.EqualTo false)
@@ -58,7 +58,7 @@ let HasCorrectShebangTest3() =
[]
let HasCorrectShebangTest4() =
let fileInfo =
- (FileInfo(Path.Combine(dummyFilesDirectory.FullName, "DummyEmpty.fsx")))
+ FileInfo(Path.Combine(dummyFilesDirectory.FullName, "DummyEmpty.fsx"))
Assert.That(HasCorrectShebang fileInfo, Is.EqualTo false)
@@ -66,12 +66,12 @@ let HasCorrectShebangTest4() =
[]
let MixedLineEndingsTest1() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyWithMixedLineEndings"
)
- ))
+ )
Assert.That(MixedLineEndings fileInfo, Is.EqualTo true)
@@ -79,9 +79,9 @@ let MixedLineEndingsTest1() =
[]
let MixedLineEndingsTest2() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(dummyFilesDirectory.FullName, "DummyWithLFLineEndings")
- ))
+ )
Assert.That(MixedLineEndings fileInfo, Is.EqualTo false)
@@ -89,12 +89,12 @@ let MixedLineEndingsTest2() =
[]
let MixedLineEndingsTest3() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyWithCRLFLineEndings"
)
- ))
+ )
Assert.That(MixedLineEndings fileInfo, Is.EqualTo false)
@@ -102,12 +102,12 @@ let MixedLineEndingsTest3() =
[]
let DetectUnpinnedVersionsInGitHubCI1() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyCIWithLatestTag.yml"
)
- ))
+ )
Assert.That(DetectUnpinnedVersionsInGitHubCI fileInfo, Is.EqualTo true)
@@ -115,12 +115,12 @@ let DetectUnpinnedVersionsInGitHubCI1() =
[]
let DetectUnpinnedVersionsInGitHubCI2() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyCIWithoutLatestTag.yml"
)
- ))
+ )
Assert.That(DetectUnpinnedVersionsInGitHubCI fileInfo, Is.EqualTo false)
@@ -128,12 +128,12 @@ let DetectUnpinnedVersionsInGitHubCI2() =
[]
let DetectUnpinnedDotnetToolInstallVersions1() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyCIWithUnpinnedDotnetToolInstallVersion.yml"
)
- ))
+ )
Assert.That(
DetectUnpinnedDotnetToolInstallVersions fileInfo,
@@ -144,12 +144,12 @@ let DetectUnpinnedDotnetToolInstallVersions1() =
[]
let DetectAsteriskInPackageReferenceItems1() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyFsprojWithAsterisk.fsproj"
)
- ))
+ )
Assert.That(DetectAsteriskInPackageReferenceItems fileInfo, Is.EqualTo true)
@@ -157,12 +157,12 @@ let DetectAsteriskInPackageReferenceItems1() =
[]
let DetectAsteriskInPackageReferenceItems2() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyFsprojWithoutAsterisk.fsproj"
)
- ))
+ )
Assert.That(
DetectAsteriskInPackageReferenceItems fileInfo,
@@ -173,12 +173,12 @@ let DetectAsteriskInPackageReferenceItems2() =
[]
let MissingVersionsInNugetPackageReferencesTest1() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyWithMissingVersionsInNugetPackageReferences.fsx"
)
- ))
+ )
Assert.That(
DetectMissingVersionsInNugetPackageReferences fileInfo,
@@ -189,12 +189,12 @@ let MissingVersionsInNugetPackageReferencesTest1() =
[]
let MissingVersionsInNugetPackageReferencesTest2() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyWithoutMissingVersionsInNugetPackageReferences.fsx"
)
- ))
+ )
Assert.That(
DetectMissingVersionsInNugetPackageReferences fileInfo,
@@ -205,12 +205,12 @@ let MissingVersionsInNugetPackageReferencesTest2() =
[]
let MissingVersionsInNugetPackageReferencesTest3() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyWithoutNugetPackageReferences.fsx"
)
- ))
+ )
Assert.That(
DetectMissingVersionsInNugetPackageReferences fileInfo,
@@ -221,9 +221,9 @@ let MissingVersionsInNugetPackageReferencesTest3() =
[]
let EolAtEofTest1() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(dummyFilesDirectory.FullName, "DummyWithEolAtEof.txt")
- ))
+ )
Assert.That(EolAtEof fileInfo, Is.EqualTo True)
@@ -231,12 +231,12 @@ let EolAtEofTest1() =
[]
let EolAtEofTest2() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyWithoutEolAtEof.txt"
)
- ))
+ )
Assert.That(EolAtEof fileInfo, Is.EqualTo False)
@@ -244,7 +244,7 @@ let EolAtEofTest2() =
[]
let EolAtEofTest3() =
let fileInfo =
- (FileInfo(Path.Combine(dummyFilesDirectory.FullName, "someLib.dll")))
+ FileInfo(Path.Combine(dummyFilesDirectory.FullName, "someLib.dll"))
Assert.That(EolAtEof fileInfo, Is.EqualTo NotApplicable)
@@ -252,7 +252,7 @@ let EolAtEofTest3() =
[]
let HasBinaryContentTest1() =
let fileInfo =
- (FileInfo(Path.Combine(dummyFilesDirectory.FullName, "someLib.dll")))
+ FileInfo(Path.Combine(dummyFilesDirectory.FullName, "someLib.dll"))
Assert.That(HasBinaryContent fileInfo, Is.EqualTo true)
@@ -260,7 +260,7 @@ let HasBinaryContentTest1() =
[]
let HasBinaryContentTest2() =
let fileInfo =
- (FileInfo(Path.Combine(dummyFilesDirectory.FullName, "white.png")))
+ FileInfo(Path.Combine(dummyFilesDirectory.FullName, "white.png"))
Assert.That(HasBinaryContent fileInfo, Is.EqualTo true)
@@ -268,9 +268,9 @@ let HasBinaryContentTest2() =
[]
let HasBinaryContentTest3() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(dummyFilesDirectory.FullName, "DummyNonBinaryFile.txt")
- ))
+ )
Assert.That(HasBinaryContent fileInfo, Is.EqualTo false)
@@ -279,14 +279,14 @@ let HasBinaryContentTest3() =
let DetectInconsistentVersionsInGitHubCIWorkflow1() =
let fileInfo =
- (Seq.singleton(
+ Seq.singleton(
FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyCIWithSamePulumiVersion.yml"
)
)
- ))
+ )
Assert.That(
DetectInconsistentVersionsInGitHubCIWorkflow fileInfo,
@@ -297,14 +297,14 @@ let DetectInconsistentVersionsInGitHubCIWorkflow1() =
[]
let DetectInconsistentVersionsInGitHubCIWorkflow2() =
let fileInfo =
- (Seq.singleton(
+ Seq.singleton(
FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyCIWithoutSamePulumiVersion.yml"
)
)
- ))
+ )
Assert.That(
DetectInconsistentVersionsInGitHubCIWorkflow fileInfo,
@@ -315,14 +315,14 @@ let DetectInconsistentVersionsInGitHubCIWorkflow2() =
[]
let DetectInconsistentVersionsInGitHubCIWorkflow3() =
let fileInfo =
- (Seq.singleton(
+ Seq.singleton(
FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyCIWithoutSameSetupPulumiVersion.yml"
)
)
- ))
+ )
Assert.That(
DetectInconsistentVersionsInGitHubCIWorkflow fileInfo,
@@ -333,14 +333,14 @@ let DetectInconsistentVersionsInGitHubCIWorkflow3() =
[]
let DetectInconsistentVersionsInGitHubCIWorkflow4() =
let fileInfo =
- (Seq.singleton(
+ Seq.singleton(
FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyCIWithSameSetupPulumiVersion.yml"
)
)
- ))
+ )
Assert.That(
DetectInconsistentVersionsInGitHubCIWorkflow fileInfo,
@@ -351,7 +351,7 @@ let DetectInconsistentVersionsInGitHubCIWorkflow4() =
[]
let DetectInconsistentVersionsInGitHubCIWorkflow5() =
let fileInfo =
- (seq {
+ seq {
FileInfo(
Path.Combine(
@@ -367,7 +367,7 @@ let DetectInconsistentVersionsInGitHubCIWorkflow5() =
)
)
- })
+ }
Assert.That(
DetectInconsistentVersionsInGitHubCIWorkflow fileInfo,
@@ -378,14 +378,14 @@ let DetectInconsistentVersionsInGitHubCIWorkflow5() =
[]
let DetectInconsistentVersionsInGitHubCIWorkflow6() =
let fileInfo =
- (Seq.singleton(
+ Seq.singleton(
FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyCIWithoutSameCheckoutVersion.yml"
)
)
- ))
+ )
Assert.That(
DetectInconsistentVersionsInGitHubCIWorkflow fileInfo,
@@ -396,14 +396,14 @@ let DetectInconsistentVersionsInGitHubCIWorkflow6() =
[]
let DetectInconsistentVersionsInGitHubCIWorkflow7() =
let fileInfo =
- (Seq.singleton(
+ Seq.singleton(
FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyCIWithoutSameNodeVersion.yml"
)
)
- ))
+ )
Assert.That(
DetectInconsistentVersionsInGitHubCIWorkflow fileInfo,
@@ -444,7 +444,7 @@ let DetectInconsistentVersionsInGitHubCI3() =
[]
let DetectInconsistentVersionsInNugetRefsInFSharpScripts1() =
let fileInfos =
- (seq {
+ seq {
FileInfo(
Path.Combine(
@@ -460,7 +460,7 @@ let DetectInconsistentVersionsInNugetRefsInFSharpScripts1() =
)
)
- })
+ }
Assert.That(
DetectInconsistentVersionsInNugetRefsInFSharpScripts fileInfos,
@@ -531,12 +531,12 @@ let DetectInconsistentVersionsInFSharpScriptsAndProjects() =
[]
let NonVerboseFlagsInGitHubCI1() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyCIWithNonVerboseFlag.yml"
)
- ))
+ )
Assert.That(NonVerboseFlags fileInfo, Is.EqualTo true)
@@ -544,12 +544,12 @@ let NonVerboseFlagsInGitHubCI1() =
[]
let NonVerboseFlagsInGitHubCI2() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyCIWithoutNonVerboseFlags.yml"
)
- ))
+ )
Assert.That(NonVerboseFlags fileInfo, Is.EqualTo false)
@@ -557,12 +557,12 @@ let NonVerboseFlagsInGitHubCI2() =
[]
let NonVerboseFlagsInGitHubCI3() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyCIWithAcceptedNonVerboseFlag1.yml"
)
- ))
+ )
Assert.That(NonVerboseFlags fileInfo, Is.EqualTo false)
@@ -570,12 +570,12 @@ let NonVerboseFlagsInGitHubCI3() =
[]
let NonVerboseFlagsInGitHubCI4() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyScriptWithNonVerboseFlag.fsx"
)
- ))
+ )
Assert.That(NonVerboseFlags fileInfo, Is.EqualTo true)
@@ -583,12 +583,12 @@ let NonVerboseFlagsInGitHubCI4() =
[]
let NonVerboseFlagsInGitHubCI5() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyScriptWithoutNonVerboseFlag.fsx"
)
- ))
+ )
Assert.That(NonVerboseFlags fileInfo, Is.EqualTo false)
@@ -596,12 +596,12 @@ let NonVerboseFlagsInGitHubCI5() =
[]
let NonVerboseFlagsInGitHubCI6() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyCIWithAcceptedNonVerboseFlag2.yml"
)
- ))
+ )
Assert.That(NonVerboseFlags fileInfo, Is.EqualTo false)
@@ -623,19 +623,324 @@ let IsExecutableTest1() =
.UnwrapDefault()
|> ignore
- let fileInfo = (FileInfo filePath)
+ let fileInfo = FileInfo filePath
Assert.That(IsExecutable fileInfo, Is.EqualTo true)
[]
let IsExecutableTest2() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(
__SOURCE_DIRECTORY__,
"DummyFiles",
"DummyNotExecutable.fs"
)
- ))
+ )
Assert.That(IsExecutable fileInfo, Is.EqualTo false)
+
+
+[]
+let DefiningEmptyStringsWithDoubleQuotes1() =
+ let fileInfo =
+ FileInfo(
+ Path.Combine(
+ dummyFilesDirectory.FullName,
+ "DummyScriptWithConventionalEmptyString.fsx"
+ )
+ )
+
+ Assert.That(DefiningEmptyStringsWithDoubleQuotes fileInfo, Is.EqualTo false)
+
+
+[]
+let DefiningEmptyStringsWithDoubleQuotes2() =
+ let fileInfo =
+ FileInfo(
+ Path.Combine(
+ dummyFilesDirectory.FullName,
+ "DummyScriptWithNonConventionalEmptyString.fsx"
+ )
+ )
+
+ Assert.That(DefiningEmptyStringsWithDoubleQuotes fileInfo, Is.EqualTo true)
+
+
+[]
+let DefiningEmptyStringsWithDoubleQuotes3() =
+ let fileInfo =
+ FileInfo(
+ Path.Combine(
+ dummyFilesDirectory.FullName,
+ "DummyScriptWithEmptyString.fsx"
+ )
+ )
+
+ Assert.That(DefiningEmptyStringsWithDoubleQuotes fileInfo, Is.EqualTo false)
+
+
+[]
+let DefiningEmptyStringsWithDoubleQuotes4() =
+ let fileInfo =
+ FileInfo(
+ Path.Combine(
+ dummyFilesDirectory.FullName,
+ "DummyScriptWithMatchEmptyString.fsx"
+ )
+ )
+
+ Assert.That(DefiningEmptyStringsWithDoubleQuotes fileInfo, Is.EqualTo false)
+
+
+[]
+let ProjFilesNamingConvention1() =
+ let fileInfo =
+ FileInfo(
+ Path.Combine(
+ dummyFilesDirectory.FullName,
+ "DummyProjFileWithTheSameNameAsItsParentFolder",
+ "DummyProjFileWithTheSameNameAsItsParentFolder.fsproj"
+ )
+ )
+
+ Assert.That(ProjFilesNamingConvention fileInfo, Is.EqualTo false)
+
+
+[]
+let ProjFilesNamingConvention2() =
+ let fileInfo =
+ FileInfo(
+ Path.Combine(
+ dummyFilesDirectory.FullName,
+ "DummyProject",
+ "DummyProjFileWithoutTheSameNameAsItsParentFolder.fsproj"
+ )
+ )
+
+ Assert.That(ProjFilesNamingConvention fileInfo, Is.EqualTo true)
+
+
+[]
+let NamespaceConvention1() =
+ let fileInfo =
+ FileInfo(
+ Path.Combine(
+ dummyFilesDirectory.FullName,
+ "src",
+ "Foo",
+ "DummyFileUnderFooWithRightNamespace.fs"
+ )
+ )
+
+ Assert.That(NotFollowingNamespaceConvention fileInfo, Is.EqualTo false)
+
+
+[]
+let NamespaceConvention2() =
+ let fileInfo =
+ FileInfo(
+ Path.Combine(
+ dummyFilesDirectory.FullName,
+ "src",
+ "Foo",
+ "DummyFileUnderFooWithWrongNamespace.fs"
+ )
+ )
+
+ Assert.That(NotFollowingNamespaceConvention fileInfo, Is.EqualTo true)
+
+
+[]
+let NamespaceConvention3() =
+ let fileInfo =
+ FileInfo(
+ Path.Combine(
+ dummyFilesDirectory.FullName,
+ "src",
+ "Foo",
+ "Bar",
+ "DummyFileUnderBarWithRightNamespace.fs"
+ )
+ )
+
+ Assert.That(NotFollowingNamespaceConvention fileInfo, Is.EqualTo false)
+
+
+[]
+let NamespaceConvention4() =
+ let fileInfo =
+ FileInfo(
+ Path.Combine(
+ dummyFilesDirectory.FullName,
+ "src",
+ "Foo",
+ "Bar",
+ "DummyFileUnderBarWithWrongNamespace.fs"
+ )
+ )
+
+ Assert.That(NotFollowingNamespaceConvention fileInfo, Is.EqualTo true)
+
+
+[]
+let NamespaceConvention5() =
+ let fileInfo =
+ FileInfo(
+ Path.Combine(
+ dummyFilesDirectory.FullName,
+ "src",
+ "Foo",
+ "Bar",
+ "DummyFileUnderBarWithWrongNamespace2.fs"
+ )
+ )
+
+ Assert.That(NotFollowingNamespaceConvention fileInfo, Is.EqualTo true)
+
+
+[]
+let NamespaceConvention6() =
+ let fileInfo =
+ FileInfo(
+ Path.Combine(
+ dummyFilesDirectory.FullName,
+ "src",
+ "Foo",
+ "DummyFileUnderFooWithRightNamespace.cs"
+ )
+ )
+
+ Assert.That(NotFollowingNamespaceConvention fileInfo, Is.EqualTo false)
+
+
+[]
+let NamespaceConvention7() =
+ let fileInfo =
+ FileInfo(
+ Path.Combine(
+ dummyFilesDirectory.FullName,
+ "src",
+ "Foo",
+ "DummyFileUnderFooWithWrongNamespace2.fs"
+ )
+ )
+
+ Assert.That(NotFollowingNamespaceConvention fileInfo, Is.EqualTo true)
+
+
+[]
+let NamespaceConvention8() =
+ let fileInfo =
+ FileInfo(
+ Path.Combine(
+ dummyFilesDirectory.FullName,
+ "src",
+ "Foo",
+ "DummyFileUnderFooWithoutNamespace.fs"
+ )
+ )
+
+ Assert.That(NotFollowingNamespaceConvention fileInfo, Is.EqualTo false)
+
+
+[]
+let ConsoleAppConvention1() =
+ let fileInfo =
+ FileInfo(
+ Path.Combine(
+ dummyFilesDirectory.FullName,
+ "DummyProjectWithWrongConsole",
+ "DummyProjectWithWrongConsole.fsproj"
+ )
+ )
+
+ Assert.That(
+ NotFollowingConsoleAppConvention fileInfo false,
+ Is.EqualTo true
+ )
+
+
+[]
+let ConsoleAppConvention2() =
+ let fileInfo =
+ FileInfo(
+ Path.Combine(
+ dummyFilesDirectory.FullName,
+ "DummyProjectWithRight.Console",
+ "DummyProjectWithRight.Console.fsproj"
+ )
+ )
+
+ Assert.That(
+ NotFollowingConsoleAppConvention fileInfo false,
+ Is.EqualTo false
+ )
+
+
+[]
+let ConsoleAppConvention3() =
+ let fileInfo =
+ FileInfo(
+ Path.Combine(
+ dummyFilesDirectory.FullName,
+ "DummyConsoleProjectWithWrongName",
+ "DummyConsoleProjectWithWrongName.fsproj"
+ )
+ )
+
+ Assert.That(
+ NotFollowingConsoleAppConvention fileInfo false,
+ Is.EqualTo true
+ )
+
+
+[]
+let ConsoleAppConvention4() =
+ let fileInfo =
+ FileInfo(
+ Path.Combine(
+ dummyFilesDirectory.FullName,
+ "DummyConsoleProjectWithRightName.Console",
+ "DummyConsoleProjectWithRightName.Console.fsproj"
+ )
+ )
+
+ Assert.That(
+ NotFollowingConsoleAppConvention fileInfo false,
+ Is.EqualTo false
+ )
+
+
+[]
+let ConsoleAppConvention5() =
+ let fileInfo =
+ FileInfo(
+ Path.Combine(
+ dummyFilesDirectory.FullName,
+ "DummyProjectAsync",
+ "DummyProjectAsync.fsproj"
+ )
+ )
+
+ Assert.That(
+ NotFollowingConsoleAppConvention fileInfo false,
+ Is.EqualTo true
+ )
+
+
+[]
+let ConsoleAppConvention6() =
+ let fileInfo =
+ FileInfo(
+ Path.Combine(
+ dummyFilesDirectory.FullName,
+ "DummyProjectAsync.Console",
+ "DummyProjectAsync.Console.fsproj"
+ )
+ )
+
+ Assert.That(
+ NotFollowingConsoleAppConvention fileInfo false,
+ Is.EqualTo false
+ )
diff --git a/src/FileConventions.Test/FileConventions.Test.fsproj b/src/FileConventions.Test/FileConventions.Test.fsproj
index 88064c279..2b470f8d2 100644
--- a/src/FileConventions.Test/FileConventions.Test.fsproj
+++ b/src/FileConventions.Test/FileConventions.Test.fsproj
@@ -19,7 +19,7 @@
-
+
@@ -28,6 +28,8 @@
+
+
@@ -48,5 +50,13 @@
+
+
+
+
+
+
+
+
diff --git a/src/FileConventions/FileConventions.fsproj b/src/FileConventions/FileConventions.fsproj
index 9cfc3dac0..310346549 100644
--- a/src/FileConventions/FileConventions.fsproj
+++ b/src/FileConventions/FileConventions.fsproj
@@ -17,6 +17,7 @@
+
diff --git a/src/FileConventions/Library.fs b/src/FileConventions/Library.fs
index e471f54cd..c28d370dd 100644
--- a/src/FileConventions/Library.fs
+++ b/src/FileConventions/Library.fs
@@ -8,6 +8,7 @@ open System.Text.RegularExpressions
open Mono
open Mono.Unix.Native
open YamlDotNet.RepresentationModel
+open Fsdk
let SplitByEOLs (text: string) (numberOfEOLs: uint) =
if numberOfEOLs = 0u then
@@ -28,6 +29,10 @@ let SplitByEOLs (text: string) (numberOfEOLs: uint) =
preparedText.Split(separator, StringSplitOptions.None)
+let ymlAssertionError = "Bug: file should be a .yml file"
+let projAssertionError = "Bug: file should be a proj file"
+let sourceFileAssertionError = "Bug: file was not a F#/C# source file"
+let fsxAssertionError = "Bug: file was not a F# script source file"
let HasCorrectShebang(fileInfo: FileInfo) =
let fileText = File.ReadLines fileInfo.FullName
@@ -63,7 +68,7 @@ let MixedLineEndings(fileInfo: FileInfo) =
numberOfLineEndings > 1
let DetectUnpinnedVersionsInGitHubCI(fileInfo: FileInfo) =
- assert (fileInfo.FullName.EndsWith(".yml"))
+ Misc.BetterAssert (fileInfo.FullName.EndsWith ".yml") ymlAssertionError
let fileText = File.ReadAllText fileInfo.FullName
@@ -73,7 +78,7 @@ let DetectUnpinnedVersionsInGitHubCI(fileInfo: FileInfo) =
latestTagInRunsOnRegex.IsMatch fileText
let DetectUnpinnedDotnetToolInstallVersions(fileInfo: FileInfo) =
- assert (fileInfo.FullName.EndsWith(".yml"))
+ Misc.BetterAssert (fileInfo.FullName.EndsWith ".yml") ymlAssertionError
let fileLines = File.ReadLines fileInfo.FullName
@@ -91,7 +96,7 @@ let DetectUnpinnedDotnetToolInstallVersions(fileInfo: FileInfo) =
unpinnedDotnetToolInstallVersions
let DetectAsteriskInPackageReferenceItems(fileInfo: FileInfo) =
- assert (fileInfo.FullName.EndsWith "proj")
+ Misc.BetterAssert (fileInfo.FullName.EndsWith "proj") projAssertionError
let fileText = File.ReadAllText fileInfo.FullName
@@ -104,7 +109,7 @@ let DetectAsteriskInPackageReferenceItems(fileInfo: FileInfo) =
asteriskInPackageReference.IsMatch fileText
let DetectMissingVersionsInNugetPackageReferences(fileInfo: FileInfo) =
- assert (fileInfo.FullName.EndsWith ".fsx")
+ Misc.BetterAssert (fileInfo.FullName.EndsWith ".fsx") fsxAssertionError
let fileLines = File.ReadLines fileInfo.FullName
@@ -366,7 +371,9 @@ let private DetectInconsistentVersionsInYamlFiles
let DetectInconsistentVersionsInGitHubCIWorkflow(fileInfos: seq) =
fileInfos
- |> Seq.iter(fun fileInfo -> assert (fileInfo.FullName.EndsWith ".yml"))
+ |> Seq.iter(fun fileInfo ->
+ Misc.BetterAssert (fileInfo.FullName.EndsWith ".yml") ymlAssertionError
+ )
let extractVersions(node: YamlNode) =
match node with
@@ -412,7 +419,9 @@ let DetectInconsistentVersionsInGitHubCI(dir: DirectoryInfo) =
let GetVersionsMapForNugetRefsInFSharpScripts(fileInfos: seq) =
fileInfos
- |> Seq.iter(fun fileInfo -> assert (fileInfo.FullName.EndsWith ".fsx"))
+ |> Seq.iter(fun fileInfo ->
+ Misc.BetterAssert (fileInfo.FullName.EndsWith ".fsx") fsxAssertionError
+ )
let versionRegexPattern =
"#r \"nuget:\\s*([^\\s]*)\\s*,\\s*Version\\s*=\\s*([^\\s]*)\\s*\""
@@ -495,3 +504,133 @@ let NonVerboseFlags(fileInfo: FileInfo) =
let IsExecutable(fileInfo: FileInfo) =
let hasExecuteAccess = Syscall.access(fileInfo.FullName, AccessModes.X_OK)
hasExecuteAccess = 0
+
+let DefiningEmptyStringsWithDoubleQuotes(fileInfo: FileInfo) =
+ let fileText = File.ReadAllText fileInfo.FullName
+
+ Regex("(? Path.GetFileName
+
+
+ fileName <> parentDirectoryName
+
+let DoesNamespaceInclude (fileInfo: FileInfo) (word: string) =
+ let fileText = File.ReadLines fileInfo.FullName
+
+ if fileText.Any() then
+ let rightNamespace =
+ fileText |> Seq.tryFind(fun x -> x.Contains "namespace")
+
+ match rightNamespace with
+ | Some fileNamespace ->
+ let words =
+ fileNamespace.Split(' ', StringSplitOptions.RemoveEmptyEntries)
+
+ let namespaceCorrentPos = 1
+ let namespaceWordsCount = 2
+
+ if words.Length < namespaceWordsCount then
+ false
+ else
+ let namespaceName = words[namespaceCorrentPos]
+ namespaceName.Equals(word) || namespaceName.Equals($"{word};")
+ | None ->
+ // It is possible that there is a fsharp file without namespace
+ if fileInfo.FullName.EndsWith ".fs"
+ || fileInfo.FullName.EndsWith ".fsx" then
+ true
+ else
+ false
+ else
+ false
+
+let NotFollowingNamespaceConvention(fileInfo: FileInfo) =
+ Misc.BetterAssert
+ (fileInfo.FullName.EndsWith ".fs" || fileInfo.FullName.EndsWith ".cs")
+ sourceFileAssertionError
+
+ let parentDir = Path.GetDirectoryName fileInfo.FullName |> DirectoryInfo
+
+
+ if parentDir.Parent.Name = "src" then
+ DoesNamespaceInclude fileInfo parentDir.Name |> not
+
+ elif parentDir.Parent.Parent.Name = "src" then
+ DoesNamespaceInclude
+ fileInfo
+ $"{parentDir.Parent.Name}.{parentDir.Name}"
+ |> not
+
+ else
+ false
+
+
+let ContainsConsoleMethods(fileInfo: FileInfo) =
+ let fileLines = File.ReadAllLines fileInfo.FullName |> Array.toList
+
+ let rec checkLine(lines: list) =
+ match lines with
+ | [] -> false
+ | line :: tail ->
+ if
+ line.TrimStart().StartsWith("Console.Write")
+ || line.TrimStart().StartsWith("printf")
+ || line.TrimStart().Contains("Async.RunSynchronously")
+ then
+ true
+ else
+ checkLine tail
+
+ checkLine fileLines
+
+
+let ReturnAllProjectSourceFiles
+ (parentDir: DirectoryInfo)
+ (patterns: List)
+ (shouldFilter: bool)
+ =
+
+ seq {
+ for pattern in patterns do
+ if shouldFilter then
+ yield Helpers.GetFiles parentDir pattern
+ else
+ yield
+ Directory.GetFiles(
+ parentDir.FullName,
+ pattern,
+ SearchOption.AllDirectories
+ )
+ |> Seq.map(fun pathStr -> FileInfo pathStr)
+
+ }
+ |> Seq.concat
+
+
+let NotFollowingConsoleAppConvention (fileInfo: FileInfo) (shouldFilter: bool) =
+ Misc.BetterAssert (fileInfo.FullName.EndsWith "proj") projAssertionError
+ let fileText = File.ReadAllText fileInfo.FullName
+ let parentDir = Path.GetDirectoryName fileInfo.FullName
+
+ if not(fileText.Contains "Exe") then
+ let sourceFiles =
+ ReturnAllProjectSourceFiles
+ (DirectoryInfo parentDir)
+ [ "*.cs"; "*.fs" ]
+ shouldFilter
+
+ sourceFiles |> Seq.exists(fun value -> ContainsConsoleMethods value)
+
+ else
+ // project name should ends with .Console
+ // we only check parent dir because
+ // we have ProjFilesNamingConvention rule to check project name
+ parentDir.EndsWith ".Console" |> not