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  }