go.fuchsia.dev/jiri@v0.0.0-20240502161911-b66513b29486/cmd/jiri/grep_test.go (about)

     1  // Copyright 2016 The Fuchsia Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package main
     6  
     7  import (
     8  	"os"
     9  	"path/filepath"
    10  	"sort"
    11  	"testing"
    12  
    13  	"go.fuchsia.dev/jiri/gitutil"
    14  	"go.fuchsia.dev/jiri/jiritest"
    15  	"go.fuchsia.dev/jiri/project"
    16  )
    17  
    18  func setDefaultGrepFlags() {
    19  	grepFlags.n = false
    20  	grepFlags.e = ""
    21  	grepFlags.h = true
    22  	grepFlags.i = false
    23  	grepFlags.l = false
    24  	grepFlags.L = false
    25  	grepFlags.w = false
    26  }
    27  
    28  func makeProjects(t *testing.T, fake *jiritest.FakeJiriRoot) []*project.Project {
    29  	projects := []*project.Project{}
    30  	for _, name := range []string{"a", "b", "c", "t1", "t2"} {
    31  		projectPath := "r." + name
    32  		if name == "t1" {
    33  			projectPath = "sub/" + projectPath
    34  		}
    35  		if name == "t2" {
    36  			projectPath = "sub/sub2/" + projectPath
    37  		}
    38  		if err := fake.CreateRemoteProject(projectPath); err != nil {
    39  			t.Fatal(err)
    40  		}
    41  		p := project.Project{
    42  			Name:         projectPath,
    43  			Path:         filepath.Join(fake.X.Root, projectPath),
    44  			Remote:       fake.Projects[projectPath],
    45  			RemoteBranch: "main",
    46  		}
    47  		if err := fake.AddProject(p); err != nil {
    48  			t.Fatal(err)
    49  		}
    50  		projects = append(projects, &p)
    51  	}
    52  	if err := fake.UpdateUniverse(false); err != nil {
    53  		t.Fatal(err)
    54  	}
    55  
    56  	return projects
    57  }
    58  
    59  func expectGrep(t *testing.T, fake *jiritest.FakeJiriRoot, args []string, expected []string) {
    60  	results, err := doGrep(fake.X, args)
    61  	if err != nil {
    62  		t.Fatal(err)
    63  	}
    64  	sort.Strings(results)
    65  	sort.Strings(expected)
    66  	if len(results) != len(expected) {
    67  		t.Fatalf("grep %v, expected %d matches, got %d matches", args, len(expected), len(results))
    68  	}
    69  	for i, result := range results {
    70  		if result != expected[i] {
    71  			t.Fatalf("grep %v, expected:\n%s\ngot:\n%s", args, expected[i], result)
    72  		}
    73  	}
    74  }
    75  func setup(t *testing.T, fake *jiritest.FakeJiriRoot) {
    76  	cwd, err := os.Getwd()
    77  	if err != nil {
    78  		t.Fatal(err)
    79  	}
    80  	defer os.Chdir(cwd)
    81  	os.Chdir(fake.X.Root)
    82  
    83  	projects := makeProjects(t, fake)
    84  
    85  	files := []string{
    86  		"Shall I compare thee to a summer's day?",
    87  		"Thou art more lovely and more temperate:",
    88  		"And summer's lease hath all too short a date:",
    89  		"Sometime too hot the eye of heaven shines,",
    90  		"line with -hyphen",
    91  	}
    92  
    93  	if got, want := len(projects), len(files); got != want {
    94  		t.Errorf("got %v, want %v", got, want)
    95  	}
    96  
    97  	for i, project := range projects {
    98  		path := project.Path + "/file.txt"
    99  		err := os.WriteFile(path, []byte(files[i]), 0644)
   100  		if err != nil {
   101  			t.Fatal(err)
   102  		}
   103  		git := gitutil.New(fake.X, gitutil.RootDirOpt(project.Path))
   104  		git.Add(path)
   105  	}
   106  }
   107  func TestGrep(t *testing.T) {
   108  	fake, cleanup := jiritest.NewFakeJiriRoot(t)
   109  	defer cleanup()
   110  
   111  	setup(t, fake)
   112  	setDefaultGrepFlags()
   113  	expectGrep(t, fake, []string{"too"}, []string{
   114  		"r.c/file.txt:And summer's lease hath all too short a date:",
   115  		"sub/r.t1/file.txt:Sometime too hot the eye of heaven shines,",
   116  	})
   117  
   118  	expectGrep(t, fake, []string{"supercalifragilisticexpialidocious"}, []string{})
   119  }
   120  
   121  func TestNFlagGrep(t *testing.T) {
   122  	fake, cleanup := jiritest.NewFakeJiriRoot(t)
   123  	defer cleanup()
   124  
   125  	setup(t, fake)
   126  	setDefaultGrepFlags()
   127  	grepFlags.n = true
   128  	expectGrep(t, fake, []string{"too"}, []string{
   129  		"r.c/file.txt:1:And summer's lease hath all too short a date:",
   130  		"sub/r.t1/file.txt:1:Sometime too hot the eye of heaven shines,",
   131  	})
   132  }
   133  
   134  func TestWFlagGrep(t *testing.T) {
   135  	fake, cleanup := jiritest.NewFakeJiriRoot(t)
   136  	defer cleanup()
   137  
   138  	setup(t, fake)
   139  	setDefaultGrepFlags()
   140  	grepFlags.w = true
   141  	grepFlags.i = true
   142  	expectGrep(t, fake, []string{"i"}, []string{
   143  		"r.a/file.txt:Shall I compare thee to a summer's day?",
   144  	})
   145  }
   146  
   147  func TestEFlagGrep(t *testing.T) {
   148  	fake, cleanup := jiritest.NewFakeJiriRoot(t)
   149  	defer cleanup()
   150  
   151  	setup(t, fake)
   152  	setDefaultGrepFlags()
   153  	grepFlags.e = "-hyp"
   154  	expectGrep(t, fake, []string{}, []string{
   155  		"sub/sub2/r.t2/file.txt:line with -hyphen",
   156  	})
   157  }
   158  
   159  func TestIFlagGrep(t *testing.T) {
   160  	fake, cleanup := jiritest.NewFakeJiriRoot(t)
   161  	defer cleanup()
   162  
   163  	setup(t, fake)
   164  	setDefaultGrepFlags()
   165  	expectGrep(t, fake, []string{"and"}, []string{
   166  		"r.b/file.txt:Thou art more lovely and more temperate:",
   167  	})
   168  
   169  	grepFlags.i = true
   170  	expectGrep(t, fake, []string{"and"}, []string{
   171  		"r.b/file.txt:Thou art more lovely and more temperate:",
   172  		"r.c/file.txt:And summer's lease hath all too short a date:",
   173  	})
   174  }
   175  
   176  func TestLFlagGrep(t *testing.T) {
   177  	fake, cleanup := jiritest.NewFakeJiriRoot(t)
   178  	defer cleanup()
   179  
   180  	setup(t, fake)
   181  	setDefaultGrepFlags()
   182  	grepFlags.l = true
   183  	expectGrep(t, fake, []string{"too"}, []string{
   184  		"r.c/file.txt",
   185  		"sub/r.t1/file.txt",
   186  	})
   187  
   188  	setDefaultGrepFlags()
   189  	grepFlags.L = true
   190  	expectGrep(t, fake, []string{"too"}, []string{
   191  		"manifest/public",
   192  		"r.a/file.txt",
   193  		"r.b/file.txt",
   194  		"sub/sub2/r.t2/file.txt",
   195  	})
   196  }