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 }