github.com/rclone/rclone@v1.66.1-0.20240517100346-7b89735ae726/fstest/test_all/run_test.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "os/exec" 6 "regexp" 7 "testing" 8 9 "github.com/stretchr/testify/assert" 10 "github.com/stretchr/testify/require" 11 ) 12 13 func TestTestsToRegexp(t *testing.T) { 14 for _, test := range []struct { 15 in []string 16 want string 17 }{ 18 { 19 in: []string{}, 20 want: "", 21 }, 22 { 23 in: []string{"TestOne"}, 24 want: "^TestOne$", 25 }, 26 { 27 in: []string{"TestOne", "TestTwo"}, 28 want: "^(TestOne|TestTwo)$", 29 }, 30 { 31 in: []string{"TestOne", "TestTwo", "TestThree"}, 32 want: "^(TestOne|TestThree|TestTwo)$", 33 }, 34 { 35 in: []string{"TestOne/Sub1"}, 36 want: "^TestOne$/^Sub1$", 37 }, 38 { 39 in: []string{ 40 "TestOne/Sub1", 41 "TestTwo", 42 }, 43 want: "^TestOne$/^Sub1$|^TestTwo$", 44 }, 45 { 46 in: []string{ 47 "TestOne/Sub1", 48 "TestOne/Sub2", 49 "TestTwo", 50 }, 51 want: "^TestOne$/^(Sub1|Sub2)$|^TestTwo$", 52 }, 53 { 54 in: []string{ 55 "TestOne/Sub1", 56 "TestOne/Sub2/SubSub1", 57 "TestTwo", 58 }, 59 want: "^TestOne$/^Sub1$|^TestOne$/^Sub2$/^SubSub1$|^TestTwo$", 60 }, 61 { 62 in: []string{ 63 "TestTests/A1", 64 "TestTests/B/B1", 65 "TestTests/C/C3/C31", 66 }, 67 want: "^TestTests$/^A1$|^TestTests$/^B$/^B1$|^TestTests$/^C$/^C3$/^C31$", 68 }, 69 } { 70 got := testsToRegexp(test.in) 71 assert.Equal(t, test.want, got, fmt.Sprintf("in=%v want=%q got=%q", test.in, test.want, got)) 72 } 73 } 74 75 var runRe = regexp.MustCompile(`(?m)^\s*=== RUN\s*(Test.*?)\s*$`) 76 77 // Test the regexp work with the -run flag in actually selecting the right tests 78 func TestTestsToRegexpLive(t *testing.T) { 79 for _, test := range []struct { 80 in []string 81 want []string 82 }{ 83 { 84 in: []string{ 85 "TestTests/A1", 86 "TestTests/C/C3", 87 }, 88 want: []string{ 89 "TestTests", 90 "TestTests/A1", 91 "TestTests/C", 92 "TestTests/C/C3", 93 "TestTests/C/C3/C31", 94 "TestTests/C/C3/C32", 95 }, 96 }, 97 { 98 in: []string{ 99 "TestTests", 100 "TestTests/A1", 101 "TestTests/B", 102 "TestTests/B/B1", 103 "TestTests/C", 104 }, 105 want: []string{ 106 "TestTests", 107 "TestTests/A1", 108 "TestTests/B", 109 "TestTests/B/B1", 110 "TestTests/C", 111 "TestTests/C/C1", 112 "TestTests/C/C2", 113 "TestTests/C/C3", 114 "TestTests/C/C3/C31", 115 "TestTests/C/C3/C32", 116 }, 117 }, 118 { 119 in: []string{ 120 "TestTests/A1", 121 "TestTests/B/B1", 122 "TestTests/C/C3/C31", 123 }, 124 want: []string{ 125 "TestTests", 126 "TestTests/A1", 127 "TestTests/B", 128 "TestTests/B/B1", 129 "TestTests/C", 130 "TestTests/C/C3", 131 "TestTests/C/C3/C31", 132 }, 133 }, 134 { 135 in: []string{ 136 "TestTests/B/B1", 137 "TestTests/C/C3/C31", 138 }, 139 want: []string{ 140 "TestTests", 141 "TestTests/B", 142 "TestTests/B/B1", 143 "TestTests/C", 144 "TestTests/C/C3", 145 "TestTests/C/C3/C31", 146 }, 147 }, 148 } { 149 runRegexp := testsToRegexp(test.in) 150 cmd := exec.Command("go", "test", "-v", "-run", runRegexp) 151 out, err := cmd.CombinedOutput() 152 require.NoError(t, err) 153 var got []string 154 for _, match := range runRe.FindAllSubmatch(out, -1) { 155 got = append(got, string(match[1])) 156 } 157 assert.Equal(t, test.want, got, fmt.Sprintf("in=%v want=%v got=%v, runRegexp=%q", test.in, test.want, got, runRegexp)) 158 } 159 } 160 161 var nilTest = func(t *testing.T) {} 162 163 // Nested tests for TestTestsToRegexpLive to run 164 func TestTests(t *testing.T) { 165 t.Run("A1", nilTest) 166 t.Run("A2", nilTest) 167 t.Run("B", func(t *testing.T) { 168 t.Run("B1", nilTest) 169 t.Run("B2", nilTest) 170 }) 171 t.Run("C", func(t *testing.T) { 172 t.Run("C1", nilTest) 173 t.Run("C2", nilTest) 174 t.Run("C3", func(t *testing.T) { 175 t.Run("C31", nilTest) 176 t.Run("C32", nilTest) 177 }) 178 }) 179 }