...
1 package cascadia
2
3 import (
4 "encoding/json"
5 "io/ioutil"
6 "log"
7 "os"
8 "reflect"
9 "testing"
10
11 "golang.org/x/net/html"
12 )
13
14 func TestInvalidSelectors(t *testing.T) {
15 c, err := ioutil.ReadFile("test_resources/invalid_selectors.json")
16 if err != nil {
17 t.Fatal(err)
18 }
19 var tests []invalidSelector
20 if err = json.Unmarshal(c, &tests); err != nil {
21 t.Fatal(err)
22 }
23 for _, test := range tests {
24 _, err := ParseGroupWithPseudoElements(test.Selector)
25 if err == nil {
26 t.Fatalf("%s -> expected error on invalid selector : %s", test.Name, test.Selector)
27 }
28 }
29 }
30
31 func parseReference(filename string) *html.Node {
32 f, err := os.Open(filename)
33 if err != nil {
34 log.Fatal(err)
35 }
36 node, err := html.Parse(f)
37 if err != nil {
38 log.Fatal(err)
39 }
40 return node
41 }
42
43 func getId(n *html.Node) string {
44 for _, attr := range n.Attr {
45 if attr.Key == "id" {
46 return attr.Val
47 }
48 }
49 return ""
50 }
51
52 func isEqual(m map[string]int, l []string) bool {
53 expected := map[string]int{}
54 for _, s := range l {
55 expected[s]++
56 }
57 return reflect.DeepEqual(m, expected)
58 }
59
60 func loadValidSelectors(t *testing.T) []validSelector {
61 c, err := ioutil.ReadFile("test_resources/valid_selectors.json")
62 if err != nil {
63 t.Fatal(err)
64 }
65 var tests []validSelector
66 if err = json.Unmarshal(c, &tests); err != nil {
67 t.Fatal(err)
68 }
69 return tests
70 }
71
72 func TestValidSelectors(t *testing.T) {
73 tests := loadValidSelectors(t)
74 doc := parseReference("test_resources/content.xhtml")
75 for i, test := range tests {
76 if test.Xfail {
77 t.Logf("skiped test %s", test.Name)
78 continue
79 }
80 sels, err := ParseGroupWithPseudoElements(test.Selector)
81 if err != nil {
82 t.Fatalf("%s -> unable to parse valid selector : %s : %s", test.Name, test.Selector, err)
83 }
84 matchingNodes := map[*html.Node]bool{}
85 for _, sel := range sels {
86 if sel.PseudoElement() != "" {
87 continue
88 }
89 for _, node := range Selector(sel.Match).MatchAll(doc) {
90 matchingNodes[node] = true
91 }
92 }
93 matchingIds := map[string]int{}
94 for node := range matchingNodes {
95 matchingIds[getId(node)]++
96 }
97 if !isEqual(matchingIds, test.Expect) {
98 t.Fatalf("test %d %s : expected %v got %v", i, test.Name, test.Expect, matchingIds)
99 }
100
101 }
102 }
103
View as plain text