...

Source file src/github.com/andybalholm/cascadia/w3_test.go

Documentation: github.com/andybalholm/cascadia

     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 // pseudo element doesn't count as a match in this test since they are not part of the document
    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