-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathheuristics_internal_test.go
More file actions
87 lines (82 loc) · 2.77 KB
/
Copy pathheuristics_internal_test.go
File metadata and controls
87 lines (82 loc) · 2.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package languages
import (
"bytes"
"context"
"regexp"
"strings"
"testing"
"github.com/git-pkgs/scan"
)
func TestDetectEveryHeuristicGroup(t *testing.T) {
inputs := []string{
"", "const count: number = 1;\n", "use strict;\npackage Demo::Client;\n",
"{\"openapi\":\"3.1.0\"}\n", "openapi: 3.1.0\npaths: {}\n",
"\t\tHP: 100\n", "#include <vector>\nint main() {}\n",
".Dd October 1\n.Dt TEST 1\n.Sh NAME\n", "BEGIN\nRETURN foo\nEND\nGOSUB 100\n",
"<?xml version=\"1.0\"?>\n<TS version=\"2.1\"></TS>\n",
"#!/usr/bin/ruby\nputs 'hello'\n", "\x00binary",
"\xff\xfe{\x00}\x00\n\x00", "\xff\xfe\x00\x00{\x00\x00\x00}\x00\x00\x00",
}
analyses := make([]Analysis, len(inputs))
for i, input := range inputs {
Analyze([]byte(input), false, &analyses[i])
}
for _, group := range heuristicGroups {
t.Run(group.extensions[0], func(t *testing.T) {
t.Parallel()
for _, extension := range group.extensions {
for _, name := range []string{"src/sample" + extension, "src/SAMPLE" + strings.ToUpper(extension)} {
for i, input := range inputs {
if got, want := Detect(name, []byte(input)), analyses[i].Detect(name); got != want {
t.Fatalf("%s %q: got %+v, want %+v", name, input, got, want)
}
assertReaderHeuristic(t, name, input, analyses[i].Detect(name))
}
}
}
})
}
}
func assertReaderHeuristic(t *testing.T, name, input string, want Result) {
t.Helper()
var analysis Analysis
if err := AnalyzeReader(context.Background(), strings.NewReader(input), ReadOptions{Filename: name, Prefix: true}, &analysis); err != nil {
t.Fatal(err)
}
if got := analysis.Detect(name); got != want {
t.Fatalf("reader %s %q: got %+v, want %+v", name, input, got, want)
}
}
func TestHeuristicScannerMatchesRegexp(t *testing.T) {
inputs := [][]byte{
nil,
[]byte("package main\nfunc main() {}\n"),
[]byte("\t\tHP: 10\n---\n"),
[]byte("{\"openapi\":\"3.1.0\"}"),
[]byte("first line\n#define DEBUG 1\n#include <vector>\n"),
[]byte("use strict;\npackage Demo::Client;\n"),
[]byte(".Dd October 1\n.Dt TEST 1\n.Sh NAME\n"),
[]byte("BEGIN\nRETURN foo\nEND\nGOSUB 100\n"),
bytes.Repeat([]byte("x\n\t "), 256),
}
compiled := make([]*regexp.Regexp, len(heuristicPatterns))
for i, pattern := range heuristicPatterns {
compiled[i] = regexp.MustCompile(pattern)
}
database := sharedHeuristics().database
scratch := scan.NewScratch(database)
for _, input := range inputs {
var matched [len(heuristicPatterns)]bool
if err := database.Scan(input, scratch, func(match scan.Match) error {
matched[match.ID] = true
return nil
}); err != nil {
t.Fatal(err)
}
for i, pattern := range compiled {
if want := pattern.Match(input); matched[i] != want {
t.Errorf("pattern %d %q, input %q: got %t, want %t", i, pattern, input, matched[i], want)
}
}
}
}