diff --git a/scripts/checkCommits1by1.fsx b/scripts/checkCommits1by1.fsx
index f15feb45..8b102fdd 100755
--- a/scripts/checkCommits1by1.fsx
+++ b/scripts/checkCommits1by1.fsx
@@ -9,7 +9,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 09fd0d5e..6eff0616 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 00000000..0c868a6f
--- /dev/null
+++ b/scripts/dotnetFileConventions.fsx
@@ -0,0 +1,79 @@
+#!/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"
+
+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 3f2b712b..d01257a5 100755
--- a/scripts/eofConvention.fsx
+++ b/scripts/eofConvention.fsx
@@ -4,6 +4,7 @@ open System.IO
open System
#r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1"
+#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 cecaf6b5..06c6c8a1 100755
--- a/scripts/executableConvention.fsx
+++ b/scripts/executableConvention.fsx
@@ -4,8 +4,9 @@ open System
open System.IO
#r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1"
-#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
diff --git a/scripts/gitPush1by1.fsx b/scripts/gitPush1by1.fsx
index c336cfc1..58ace0fd 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/inconsistentVersionsInFSharpScripts.fsx b/scripts/inconsistentVersionsInFSharpScripts.fsx
index 93922496..82b72af9 100755
--- a/scripts/inconsistentVersionsInFSharpScripts.fsx
+++ b/scripts/inconsistentVersionsInFSharpScripts.fsx
@@ -4,9 +4,10 @@ open System.IO
open System.Linq
#r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1"
+#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 f8041a45..6777390c 100755
--- a/scripts/inconsistentVersionsInGitHubCI.fsx
+++ b/scripts/inconsistentVersionsInGitHubCI.fsx
@@ -3,9 +3,10 @@
open System.IO
#r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1"
+#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 427826a6..d3cef830 100755
--- a/scripts/mixedLineEndings.fsx
+++ b/scripts/mixedLineEndings.fsx
@@ -4,9 +4,10 @@ open System
open System.IO
#r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1"
+#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 54bd123d..eaac7547 100755
--- a/scripts/nonVerboseFlagsInGitHubCIAndScripts.fsx
+++ b/scripts/nonVerboseFlagsInGitHubCIAndScripts.fsx
@@ -4,9 +4,10 @@ open System
open System.IO
#r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1"
+#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 965a9aad..5c2c9320 100755
--- a/scripts/shebangConvention.fsx
+++ b/scripts/shebangConvention.fsx
@@ -4,9 +4,10 @@ open System
open System.IO
#r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1"
+#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/unpinnedDotnetPackageVersions.fsx b/scripts/unpinnedDotnetPackageVersions.fsx
index 56da33c0..af45ef18 100755
--- a/scripts/unpinnedDotnetPackageVersions.fsx
+++ b/scripts/unpinnedDotnetPackageVersions.fsx
@@ -4,9 +4,10 @@ open System
open System.IO
#r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1"
+#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 92f35dcc..7cdffc99 100755
--- a/scripts/unpinnedDotnetToolInstallVersions.fsx
+++ b/scripts/unpinnedDotnetToolInstallVersions.fsx
@@ -4,9 +4,10 @@ open System
open System.IO
#r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1"
+#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 07d31cc9..31615dc8 100755
--- a/scripts/unpinnedGitHubActionsImageVersions.fsx
+++ b/scripts/unpinnedGitHubActionsImageVersions.fsx
@@ -4,9 +4,10 @@ open System
open System.IO
#r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1"
+#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/unpinnedNugetPackageReferenceVersions.fsx b/scripts/unpinnedNugetPackageReferenceVersions.fsx
index 72e0e74b..44370c1a 100755
--- a/scripts/unpinnedNugetPackageReferenceVersions.fsx
+++ b/scripts/unpinnedNugetPackageReferenceVersions.fsx
@@ -4,9 +4,10 @@ open System
open System.IO
#r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1"
+#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/wrapLatestCommitMsg.fsx b/scripts/wrapLatestCommitMsg.fsx
index 64f757eb..4fd8e11e 100755
--- a/scripts/wrapLatestCommitMsg.fsx
+++ b/scripts/wrapLatestCommitMsg.fsx
@@ -5,11 +5,11 @@ open System
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"
+#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 00000000..299cf40e
--- /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 00000000..543f77ad
--- /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 00000000..299cf40e
--- /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 00000000..543f77ad
--- /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 00000000..e69de29b
diff --git a/src/FileConventions.Test/DummyFiles/DummyProject/DummyProjFileWithoutTheSameNameAsItsParentFolder.fsproj b/src/FileConventions.Test/DummyFiles/DummyProject/DummyProjFileWithoutTheSameNameAsItsParentFolder.fsproj
new file mode 100644
index 00000000..e69de29b
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 00000000..299cf40e
--- /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 00000000..6cceb79d
--- /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 00000000..9263cfd6
--- /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 00000000..bf14df5f
--- /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 00000000..299cf40e
--- /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 00000000..543f77ad
--- /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 00000000..9263cfd6
--- /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 00000000..78fab96d
--- /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 00000000..cc2a7e4a
--- /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 00000000..1ae049d8
--- /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 00000000..f8911d75
--- /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 00000000..126e0616
--- /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 00000000..7de30ff2
--- /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 00000000..b1a3e545
--- /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 00000000..0dda3513
--- /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 00000000..2f2bebd3
--- /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 00000000..a36e204f
--- /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 00000000..9704ca2b
--- /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 00000000..d631c774
--- /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 00000000..4c736242
--- /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 e32fe7a4..0e86a853 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,
@@ -424,7 +424,7 @@ let DetectInconsistentVersionsInGitHubCI1() =
[]
let DetectInconsistentVersionsInNugetRefsInFSharpScripts1() =
let fileInfos =
- (seq {
+ seq {
FileInfo(
Path.Combine(
@@ -440,7 +440,7 @@ let DetectInconsistentVersionsInNugetRefsInFSharpScripts1() =
)
)
- })
+ }
Assert.That(
DetectInconsistentVersionsInNugetRefsInFSharpScripts fileInfos,
@@ -478,12 +478,12 @@ let DetectInconsistentVersionsInFSharpScripts2() =
[]
let NonVerboseFlagsInGitHubCI1() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyCIWithNonVerboseFlag.yml"
)
- ))
+ )
Assert.That(NonVerboseFlags fileInfo, Is.EqualTo true)
@@ -491,12 +491,12 @@ let NonVerboseFlagsInGitHubCI1() =
[]
let NonVerboseFlagsInGitHubCI2() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyCIWithoutNonVerboseFlags.yml"
)
- ))
+ )
Assert.That(NonVerboseFlags fileInfo, Is.EqualTo false)
@@ -504,12 +504,12 @@ let NonVerboseFlagsInGitHubCI2() =
[]
let NonVerboseFlagsInGitHubCI3() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyCIWithAcceptedNonVerboseFlag1.yml"
)
- ))
+ )
Assert.That(NonVerboseFlags fileInfo, Is.EqualTo false)
@@ -517,12 +517,12 @@ let NonVerboseFlagsInGitHubCI3() =
[]
let NonVerboseFlagsInGitHubCI4() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyScriptWithNonVerboseFlag.fsx"
)
- ))
+ )
Assert.That(NonVerboseFlags fileInfo, Is.EqualTo true)
@@ -530,12 +530,12 @@ let NonVerboseFlagsInGitHubCI4() =
[]
let NonVerboseFlagsInGitHubCI5() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyScriptWithoutNonVerboseFlag.fsx"
)
- ))
+ )
Assert.That(NonVerboseFlags fileInfo, Is.EqualTo false)
@@ -543,12 +543,12 @@ let NonVerboseFlagsInGitHubCI5() =
[]
let NonVerboseFlagsInGitHubCI6() =
let fileInfo =
- (FileInfo(
+ FileInfo(
Path.Combine(
dummyFilesDirectory.FullName,
"DummyCIWithAcceptedNonVerboseFlag2.yml"
)
- ))
+ )
Assert.That(NonVerboseFlags fileInfo, Is.EqualTo false)
@@ -570,19 +570,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 88064c27..2b470f8d 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 9c8c6d17..6ff11dcd 100644
--- a/src/FileConventions/FileConventions.fsproj
+++ b/src/FileConventions/FileConventions.fsproj
@@ -6,13 +6,14 @@
-
-
+
+
+
diff --git a/src/FileConventions/Library.fs b/src/FileConventions/Library.fs
index 6a5ea374..70358045 100644
--- a/src/FileConventions/Library.fs
+++ b/src/FileConventions/Library.fs
@@ -7,6 +7,12 @@ open System.Text.RegularExpressions
open Mono
open Mono.Unix.Native
+open Fsdk
+
+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
@@ -42,7 +48,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
@@ -52,7 +58,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
@@ -70,7 +76,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
@@ -83,7 +89,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
@@ -284,7 +290,9 @@ let private DetectInconsistentVersions
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 inconsistentVersionsType1 =
DetectInconsistentVersions
@@ -310,7 +318,9 @@ let DetectInconsistentVersionsInNugetRefsInFSharpScripts
(fileInfos: seq)
=
fileInfos
- |> Seq.iter(fun fileInfo -> assert (fileInfo.FullName.EndsWith ".fsx"))
+ |> Seq.iter(fun fileInfo ->
+ Misc.BetterAssert (fileInfo.FullName.EndsWith ".fsx") fsxAssertionError
+ )
DetectInconsistentVersions
fileInfos
@@ -390,3 +400,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