Beispiel #1
0
        public async Task CheckTypo()
        {
            // タイプミス / スペルミス辞書
            // Add(誤, 正) で追加していく
            var typoDictionary = new Dictionary <Regex, string>();
            var failedList     = new List <string>();

            typoDictionary.Add(new Regex("Utli", RegexOptions.IgnoreCase), "Util");

            var paths = new List <string>();

            foreach (var path in await VersioningUtils.GetVersionedFiles(UtilsChecker.textExts))
            {
                // 例外
                if (path.EndsWith("TypoChecker.cs"))
                {
                    continue;                                  // このファイル
                }
                var text = File.ReadAllText(path);
                foreach (var pair in typoDictionary)
                {
                    var match = pair.Key.Match(text);
                    if (match.Success)
                    {
                        failedList.Add($"誤: {match.Value}\n正: {pair.Value}\npath: {path}");
                    }
                }
            }
            Assert.True(0 == failedList.Count(), $"タイプミスが見つかりました。\n{String.Join("\n----\n", failedList)}");
        }
Beispiel #2
0
        public async Task useUTF8()
        {
            var files = await VersioningUtils.GetVersionedFiles(UtilsChecker.textExts);

            var failedFiles = new List <string>();

            foreach (var path in files)
            {
                // 例外
                if (path.Contains("/reactapp/src"))
                {
                    continue;                                 // react-script 経由で確認されるので無視する.
                }
                byte[] bin = File.ReadAllBytes(path);
                if (bin[0] == 0xEF && bin[1] == 0xBB && bin[2] == 0xBF)
                {
                    // ok
                }
                else
                {
                    failedFiles.Add(path);
                }
            }
            Assert.True(0 == failedFiles.Count(), $"UTF-8 でないか、BOMで始まらないファイルが見つかりました。非日本語環境でビルドに成功させるために、ソースコードはBOM付きUTF-8で保存してください。\n{String.Join("\n", failedFiles)}");
        }
Beispiel #3
0
        public async Task UseAsyncVoid()
        {
            // async void を許容する関数
            string[] extFunctions = new string[] {
                "OnInspectorGUI", // Unity エディタ拡張
            };

            var files = await VersioningUtils.GetVersionedFiles(new string[] { ".cs" });

            var reg        = new Regex($@"\s+async\s+void\s+(?!{String.Join('|', extFunctions)})");
            var failedList = new List <string>();

            foreach (var path in files)
            {
                // 例外
                if (path.EndsWith("AsyncVoidChecker.cs"))
                {
                    continue;                                       // このファイル
                }
                var text = File.ReadAllText(path, Encoding.UTF8);
                if (reg.IsMatch(text))
                {
                    failedList.Add(path);
                }
            }
            Assert.True(0 == failedList.Count(), $"void を返す async 関数が見つかりました。戻り値を Task または Task<T> に変更してください。\n{String.Join('\n', failedList)}");
        }
Beispiel #4
0
        public async Task GetRepositoryRootChecker()
        {
            var path = await VersioningUtils.GetRepositoryRoot();

            output.WriteLine(@$ "path = {path}");

            // パスが正しければ README.md と .gitignore が存在するはず
            Assert.True(File.Exists(@$ "{path}/README.md"), "README.md not found");
            Assert.True(File.Exists(@$ "{path}/.gitignore"), ".gitignore not found");
        }
Beispiel #5
0
        public async Task GetVersionedFilesChecker()
        {
            var paths = await VersioningUtils.GetVersionedFiles();

            output.WriteLine(String.Join("\n", paths));

            foreach (var path in paths)
            {
                Assert.True(File.Exists(path), $"Listed file does not exist.\npath = {path}");
            }

            Assert.True(1 <= paths.Where(text => text.EndsWith("README.md")).Count(), "README.md not found.");
        }
Beispiel #6
0
        public async Task UseOfNull()
        {
            var files = await VersioningUtils.GetVersionedFiles(UtilsChecker.jstsExts);

            var reg        = new Regex(@"null");
            var failedList = new List <string>();

            foreach (var path in files)
            {
                // 例外
                // if (path.EndsWith("reportWebVitals.ts")) continue; // React が生成したファイル

                var text = File.ReadAllText(path, Encoding.UTF8);
                if (reg.IsMatch(text))
                {
                    failedList.Add(path);
                }
            }
            Assert.True(0 == failedList.Count(), $"JavaScript や TypeScript では、混乱を避けるために null の代わりに undefined を使用してください。\n{String.Join('\n', failedList)}");
        }
        public async Task UseHtml5Doctype()
        {
            var files = await VersioningUtils.GetVersionedFiles(new string[] { ".htm", ".html" });

            var reg        = new Regex(@"^<!DOCTYPE html>", RegexOptions.IgnoreCase);
            var failedList = new List <string>();

            foreach (var path in files)
            {
                // 例外
                //if (path.Contains("something")) continue;

                var text = File.ReadAllText(path, Encoding.UTF8);
                if (!reg.IsMatch(text))
                {
                    failedList.Add(path);
                }
            }
            Assert.True(0 == failedList.Count(), $"文書型宣言がHTML5のものでない .htm ファイルが見つかりました。HTMLではファイルの先頭に「<!DOCTYPE html>」を指定してください。\n{String.Join('\n', failedList)}");
        }
        public async Task UseDecodeUri()
        {
            var files = await VersioningUtils.GetVersionedFiles(UtilsChecker.jstsExts);

            var reg        = new Regex(@"decodeURI", RegexOptions.IgnoreCase);
            var failedList = new List <string>();

            foreach (var path in files)
            {
                // 例外
                //if (path.Contains("something")) continue;

                var text = File.ReadAllText(path, Encoding.UTF8);
                if (reg.IsMatch(text))
                {
                    failedList.Add(path);
                }
            }
            Assert.True(0 == failedList.Count(), $"decodeURI 関数はエンコードが限定的なので、代わりに decodeURIComponent 関数を検討してください。\n{String.Join('\n', failedList)}");
        }
Beispiel #9
0
        public async Task UseOfNumber()
        {
            var files = await VersioningUtils.GetVersionedFiles(UtilsChecker.jstsExts);

            var reg        = new Regex(@"Number\(");
            var failedList = new List <string>();

            foreach (var path in files)
            {
                // 例外
                //if (path.Contains("something")) continue;

                var text = File.ReadAllText(path, Encoding.UTF8);
                if (reg.IsMatch(text))
                {
                    failedList.Add(path);
                }
            }
            Assert.True(0 == failedList.Count(), $"可読性のため Number 関数の代わりに、parseInt か parseFloat の使用を検討してください。\n{String.Join('\n', failedList)}");
        }
Beispiel #10
0
        public async Task UseOfBind()
        {
            var files = await VersioningUtils.GetVersionedFiles(UtilsChecker.jstsExts);

            var reg        = new Regex(@"\.bind\(");
            var failedList = new List <string>();

            foreach (var path in files)
            {
                // 例外
                // if (path.EndsWith("reportWebVitals.ts")) continue; // React が生成したファイル

                var text = File.ReadAllText(path, Encoding.UTF8);
                if (reg.IsMatch(text))
                {
                    failedList.Add(path);
                }
            }
            Assert.True(0 == failedList.Count(), $"\n{String.Join('\n', failedList)}");
        }
Beispiel #11
0
        public async Task UseOfThen()
        {
            var files = await VersioningUtils.GetVersionedFiles(UtilsChecker.jstsExts);

            var reg        = new Regex(@"\.then\(");
            var failedList = new List <string>();

            foreach (var path in files)
            {
                // 例外
                if (path.EndsWith("reportWebVitals.ts"))
                {
                    continue;                                      // React が生成したファイル
                }
                var text = File.ReadAllText(path, Encoding.UTF8);
                if (reg.IsMatch(text))
                {
                    failedList.Add(path);
                }
            }
            Assert.True(0 == failedList.Count(), $"非同期処理は then関数, catch関数の代わりに、async, await (と try..catch...) を使用してください。\n{String.Join('\n', failedList)}");
        }
Beispiel #12
0
        public async Task UseOfVar()
        {
            var files = await VersioningUtils.GetVersionedFiles(new string[] { ".ts", ".tsx" });

            var reg        = new Regex(@"[\(\s^{]+var\s+");
            var failedList = new List <string>();

            foreach (var path in files)
            {
                // 例外
                if (path.EndsWith(".d.ts"))
                {
                    continue;                         // 型定義ファイル
                }
                var text = File.ReadAllText(path, Encoding.UTF8);
                if (reg.IsMatch(text))
                {
                    failedList.Add(path);
                }
            }
            Assert.True(0 == failedList.Count(), $"変数宣言は var ではなく let を使ってください。\n{String.Join('\n', failedList)}");
        }
Beispiel #13
0
        public async Task UseServiceNotification()
        {
            var files = await VersioningUtils.GetVersionedFiles(new string[] { ".cs" });

            var reg        = new Regex(@"MessageBoxOptions\.ServiceNotification");
            var failedList = new List <string>();

            foreach (var path in files)
            {
                // 例外
                if (path.Contains("DefaultDesktopOnlyChecker.cs"))
                {
                    continue;                                                // このファイルを除外
                }
                var text = File.ReadAllText(path, Encoding.UTF8);
                if (reg.IsMatch(text))
                {
                    failedList.Add(path);
                }
            }
            Assert.True(0 == failedList.Count(), $"MessageBoxOptions.ServiceNotification は親ウインドウに対するイベントが遮断されなくなります。ほとんどの場合で、あなたが想定していない動作と思われます。指定を削除してください。\n{String.Join('\n', failedList)}");
        }
        public async Task HasEditorconfig()
        {
            var path = await VersioningUtils.GetRepositoryRoot();

            Assert.True(File.Exists(@$ "{path}/.editorconfig"));
        }
        public async Task HasGitignore()
        {
            var path = await VersioningUtils.GetRepositoryRoot();

            Assert.True(File.Exists(@$ "{path}/.gitignore"));
        }
        public async Task HasLicense()
        {
            var path = await VersioningUtils.GetRepositoryRoot();

            Assert.True(File.Exists(@$ "{path}/LICENSE.txt"));
        }
        public async Task HasReadme()
        {
            var path = await VersioningUtils.GetRepositoryRoot();

            Assert.True(File.Exists(@$ "{path}/README.md"));
        }
        public async Task CheckTrojanLetter()
        {
            var list = await VersioningUtils.FindTrojanLetters(new string[] { ".cs", ".html", ".htm", ".tsx", "ts", ".css", ".txt", ".md" });

            Assert.True(0 == list.Count(), $"通常利用しない制御文字を含むソースコードが見つかりました。StackOverflow 等にある悪意のあるコードがコピーされた可能性があります。\n{String.Join("\n----\n", list)}");
        }