package main import ( "fmt" "reflect" "testing" ) const HTML_STRING = ` title
product-table-caption
Name Stock Price
product110100
product220200
product330300
product440400
` func TestFilterXPath(t *testing.T) { var tests = []struct { Query string Want []string }{ {"//title", []string{"title"}}, {"//table[@id='product-table']//tr//td[last()]", []string{`100`, `200`, `300`, `400`}}, {"//td[@class='price']", []string{`100`, `200`, `300`, `400`}}, {"//table[@id='product-table']//tr//td[2]", []string{`10`, `20`, `30`, `40`}}, {"//td[@class='stock']", []string{`10`, `20`, `30`, `40`}}, } for _, test := range tests { testname := fmt.Sprintf("%s", test.Query) t.Run(testname, func(t *testing.T) { want := []string{} getFilterResultXPath( HTML_STRING, &Filter{ From: test.Query, }, &want, ) if !reflect.DeepEqual(test.Want, want) { t.Errorf("Got %s, want %s", want, test.Want) } }) } } func TestFilterSubstring(t *testing.T) { var tests = []struct { Input string Query string Want string }{ {"0123456789", "0", "0"}, {"0123456789", "9", "9"}, {"0123456789", "0,9", "09"}, {"0123456789", "0:3", "012"}, {"0123456789", ":3", "012"}, {"0123456789", "3:", "3456789"}, {"0123456789", "-3:", "789"}, {"0123456789", ":-3", "0123456"}, {"0123456789", ":-1", "012345678"}, {"0123456789", "0,3,7,9", "0379"}, {"0123456789", "0:3,7,9", "01279"}, {"世界", "1", "界"}, {"世界日本語", ":3", "世界日"}, {"世界日本語", ":-1", "世界日本"}, {"世界日本語", "-1:", "語"}, {"0123456789", "A", "0123456789"}, {"0123456789", "1:A", "0123456789"}, {"0123456789", "A:1", "0123456789"}, {"0123456789", "A:B", "0123456789"}, {"0123456789", "A:B:C", "0123456789"}, } for _, test := range tests { testname := fmt.Sprintf("%s %s", test.Input, test.Query) t.Run(testname, func(t *testing.T) { want := []string{test.Want} getFilterResultSubstring( test.Input, &Filter{ From: test.Query, }, &want, ) if want[0] != test.Want { t.Errorf("Got %s, want %s", want[0], test.Want) } }) } }