mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			186 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			186 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Go
		
	
	
	
// Copyright 2015 The Go Authors. All rights reserved.
 | 
						|
// Use of this source code is governed by a BSD-style
 | 
						|
// license that can be found in the LICENSE file.
 | 
						|
 | 
						|
package testing
 | 
						|
 | 
						|
import (
 | 
						|
	"reflect"
 | 
						|
	"regexp"
 | 
						|
	"unicode"
 | 
						|
)
 | 
						|
 | 
						|
// Verify that our IsSpace agrees with unicode.IsSpace.
 | 
						|
func TestIsSpace(t *T) {
 | 
						|
	n := 0
 | 
						|
	for r := rune(0); r <= unicode.MaxRune; r++ {
 | 
						|
		if isSpace(r) != unicode.IsSpace(r) {
 | 
						|
			t.Errorf("IsSpace(%U)=%t incorrect", r, isSpace(r))
 | 
						|
			n++
 | 
						|
			if n > 10 {
 | 
						|
				return
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestSplitRegexp(t *T) {
 | 
						|
	res := func(s ...string) []string { return s }
 | 
						|
	testCases := []struct {
 | 
						|
		pattern string
 | 
						|
		result  []string
 | 
						|
	}{
 | 
						|
		// Correct patterns
 | 
						|
		// If a regexp pattern is correct, all split regexps need to be correct
 | 
						|
		// as well.
 | 
						|
		{"", res("")},
 | 
						|
		{"/", res("", "")},
 | 
						|
		{"//", res("", "", "")},
 | 
						|
		{"A", res("A")},
 | 
						|
		{"A/B", res("A", "B")},
 | 
						|
		{"A/B/", res("A", "B", "")},
 | 
						|
		{"/A/B/", res("", "A", "B", "")},
 | 
						|
		{"[A]/(B)", res("[A]", "(B)")},
 | 
						|
		{"[/]/[/]", res("[/]", "[/]")},
 | 
						|
		{"[/]/[:/]", res("[/]", "[:/]")},
 | 
						|
		{"/]", res("", "]")},
 | 
						|
		{"]/", res("]", "")},
 | 
						|
		{"]/[/]", res("]", "[/]")},
 | 
						|
		{`([)/][(])`, res(`([)/][(])`)},
 | 
						|
		{"[(]/[)]", res("[(]", "[)]")},
 | 
						|
 | 
						|
		// Faulty patterns
 | 
						|
		// Errors in original should produce at least one faulty regexp in results.
 | 
						|
		{")/", res(")/")},
 | 
						|
		{")/(/)", res(")/(", ")")},
 | 
						|
		{"a[/)b", res("a[/)b")},
 | 
						|
		{"(/]", res("(/]")},
 | 
						|
		{"(/", res("(/")},
 | 
						|
		{"[/]/[/", res("[/]", "[/")},
 | 
						|
		{`\p{/}`, res(`\p{`, "}")},
 | 
						|
		{`\p/`, res(`\p`, "")},
 | 
						|
		{`[[:/:]]`, res(`[[:/:]]`)},
 | 
						|
	}
 | 
						|
	for _, tc := range testCases {
 | 
						|
		a := splitRegexp(tc.pattern)
 | 
						|
		if !reflect.DeepEqual(a, tc.result) {
 | 
						|
			t.Errorf("splitRegexp(%q) = %#v; want %#v", tc.pattern, a, tc.result)
 | 
						|
		}
 | 
						|
 | 
						|
		// If there is any error in the pattern, one of the returned subpatterns
 | 
						|
		// needs to have an error as well.
 | 
						|
		if _, err := regexp.Compile(tc.pattern); err != nil {
 | 
						|
			ok := true
 | 
						|
			for _, re := range a {
 | 
						|
				if _, err := regexp.Compile(re); err != nil {
 | 
						|
					ok = false
 | 
						|
				}
 | 
						|
			}
 | 
						|
			if ok {
 | 
						|
				t.Errorf("%s: expected error in any of %q", tc.pattern, a)
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestMatcher(t *T) {
 | 
						|
	testCases := []struct {
 | 
						|
		pattern     string
 | 
						|
		parent, sub string
 | 
						|
		ok          bool
 | 
						|
	}{
 | 
						|
		// Behavior without subtests.
 | 
						|
		{"", "", "TestFoo", true},
 | 
						|
		{"TestFoo", "", "TestFoo", true},
 | 
						|
		{"TestFoo/", "", "TestFoo", true},
 | 
						|
		{"TestFoo/bar/baz", "", "TestFoo", true},
 | 
						|
		{"TestFoo", "", "TestBar", false},
 | 
						|
		{"TestFoo/", "", "TestBar", false},
 | 
						|
		{"TestFoo/bar/baz", "", "TestBar/bar/baz", false},
 | 
						|
 | 
						|
		// with subtests
 | 
						|
		{"", "TestFoo", "x", true},
 | 
						|
		{"TestFoo", "TestFoo", "x", true},
 | 
						|
		{"TestFoo/", "TestFoo", "x", true},
 | 
						|
		{"TestFoo/bar/baz", "TestFoo", "bar", true},
 | 
						|
		// Subtest with a '/' in its name still allows for copy and pasted names
 | 
						|
		// to match.
 | 
						|
		{"TestFoo/bar/baz", "TestFoo", "bar/baz", true},
 | 
						|
		{"TestFoo/bar/baz", "TestFoo/bar", "baz", true},
 | 
						|
		{"TestFoo/bar/baz", "TestFoo", "x", false},
 | 
						|
		{"TestFoo", "TestBar", "x", false},
 | 
						|
		{"TestFoo/", "TestBar", "x", false},
 | 
						|
		{"TestFoo/bar/baz", "TestBar", "x/bar/baz", false},
 | 
						|
 | 
						|
		// subtests only
 | 
						|
		{"", "TestFoo", "x", true},
 | 
						|
		{"/", "TestFoo", "x", true},
 | 
						|
		{"./", "TestFoo", "x", true},
 | 
						|
		{"./.", "TestFoo", "x", true},
 | 
						|
		{"/bar/baz", "TestFoo", "bar", true},
 | 
						|
		{"/bar/baz", "TestFoo", "bar/baz", true},
 | 
						|
		{"//baz", "TestFoo", "bar/baz", true},
 | 
						|
		{"//", "TestFoo", "bar/baz", true},
 | 
						|
		{"/bar/baz", "TestFoo/bar", "baz", true},
 | 
						|
		{"//foo", "TestFoo", "bar/baz", false},
 | 
						|
		{"/bar/baz", "TestFoo", "x", false},
 | 
						|
		{"/bar/baz", "TestBar", "x/bar/baz", false},
 | 
						|
	}
 | 
						|
 | 
						|
	for _, tc := range testCases {
 | 
						|
		m := newMatcher(regexp.MatchString, tc.pattern, "-test.run")
 | 
						|
 | 
						|
		parent := &common{name: tc.parent}
 | 
						|
		if tc.parent != "" {
 | 
						|
			parent.level = 1
 | 
						|
		}
 | 
						|
		if n, ok := m.fullName(parent, tc.sub); ok != tc.ok {
 | 
						|
			t.Errorf("for pattern %q, fullName(parent=%q, sub=%q) = %q, ok %v; want ok %v",
 | 
						|
				tc.pattern, tc.parent, tc.sub, n, ok, tc.ok)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestNaming(t *T) {
 | 
						|
	m := newMatcher(regexp.MatchString, "", "")
 | 
						|
 | 
						|
	parent := &common{name: "x", level: 1} // top-level test.
 | 
						|
 | 
						|
	// Rig the matcher with some preloaded values.
 | 
						|
	m.subNames["x/b"] = 1000
 | 
						|
 | 
						|
	testCases := []struct {
 | 
						|
		name, want string
 | 
						|
	}{
 | 
						|
		// Uniqueness
 | 
						|
		{"", "x/#00"},
 | 
						|
		{"", "x/#01"},
 | 
						|
 | 
						|
		{"t", "x/t"},
 | 
						|
		{"t", "x/t#01"},
 | 
						|
		{"t", "x/t#02"},
 | 
						|
 | 
						|
		{"a#01", "x/a#01"}, // user has subtest with this name.
 | 
						|
		{"a", "x/a"},       // doesn't conflict with this name.
 | 
						|
		{"a", "x/a#01#01"}, // conflict, add disambiguating string.
 | 
						|
		{"a", "x/a#02"},    // This string is claimed now, so resume
 | 
						|
		{"a", "x/a#03"},    // with counting.
 | 
						|
		{"a#02", "x/a#02#01"},
 | 
						|
 | 
						|
		{"b", "x/b#1000"}, // rigged, see above
 | 
						|
		{"b", "x/b#1001"},
 | 
						|
 | 
						|
		// // Sanitizing
 | 
						|
		{"A:1 B:2", "x/A:1_B:2"},
 | 
						|
		{"s\t\r\u00a0", "x/s___"},
 | 
						|
		{"\x01", `x/\x01`},
 | 
						|
		{"\U0010ffff", `x/\U0010ffff`},
 | 
						|
	}
 | 
						|
 | 
						|
	for i, tc := range testCases {
 | 
						|
		if got, _ := m.fullName(parent, tc.name); got != tc.want {
 | 
						|
			t.Errorf("%d:%s: got %q; want %q", i, tc.name, got, tc.want)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |