1
2
3
4
5 package vfs_test
6
7 import (
8 "fmt"
9 "strings"
10 "testing"
11 "time"
12
13 "golang.org/x/tools/godoc/vfs"
14 "golang.org/x/tools/godoc/vfs/mapfs"
15 )
16
17 func TestNewNameSpace(t *testing.T) {
18
19
20 mount := mapfs.New(map[string]string{"fs1file": "abcdefgh"})
21
22
23 t1 := vfs.NameSpace{}
24 t1.Bind("/fs1", mount, "/", vfs.BindReplace)
25
26
27 t2 := vfs.NewNameSpace()
28 t2.Bind("/fs1", mount, "/", vfs.BindReplace)
29
30 testcases := map[string][]bool{
31 "/": {false, true},
32 "/fs1": {true, true},
33 "/fs1/fs1file": {true, true},
34 }
35
36 fss := []vfs.FileSystem{t1, t2}
37
38 for j, fs := range fss {
39 for k, v := range testcases {
40 _, err := fs.Stat(k)
41 result := err == nil
42 if result != v[j] {
43 t.Errorf("fs: %d, testcase: %s, want: %v, got: %v, err: %s", j, k, v[j], result, err)
44 }
45 }
46 }
47
48 fi, err := t2.Stat("/")
49 if err != nil {
50 t.Fatal(err)
51 }
52
53 if fi.Name() != "/" {
54 t.Errorf("t2.Name() : want:%s got:%s", "/", fi.Name())
55 }
56
57 if !fi.ModTime().IsZero() {
58 t.Errorf("t2.ModTime() : want:%v got:%v", time.Time{}, fi.ModTime())
59 }
60 }
61
62 func TestReadDirUnion(t *testing.T) {
63 for _, tc := range []struct {
64 desc string
65 ns vfs.NameSpace
66 path, want string
67 }{
68 {
69 desc: "no_go_files",
70 ns: func() vfs.NameSpace {
71 rootFs := mapfs.New(map[string]string{
72 "doc/a.txt": "1",
73 "doc/b.txt": "1",
74 "doc/dir1/d1.txt": "",
75 })
76 docFs := mapfs.New(map[string]string{
77 "doc/a.txt": "22",
78 "doc/dir2/d2.txt": "",
79 })
80 ns := vfs.NameSpace{}
81 ns.Bind("/", rootFs, "/", vfs.BindReplace)
82 ns.Bind("/doc", docFs, "/doc", vfs.BindBefore)
83 return ns
84 }(),
85 path: "/doc",
86 want: "a.txt:2,b.txt:1,dir1:0,dir2:0",
87 }, {
88 desc: "have_go_files",
89 ns: func() vfs.NameSpace {
90 a := mapfs.New(map[string]string{
91 "src/x/a.txt": "",
92 "src/x/suba/sub.txt": "",
93 })
94 b := mapfs.New(map[string]string{
95 "src/x/b.go": "package b",
96 "src/x/subb/sub.txt": "",
97 })
98 c := mapfs.New(map[string]string{
99 "src/x/c.txt": "",
100 "src/x/subc/sub.txt": "",
101 })
102 ns := vfs.NameSpace{}
103 ns.Bind("/", a, "/", vfs.BindReplace)
104 ns.Bind("/", b, "/", vfs.BindAfter)
105 ns.Bind("/", c, "/", vfs.BindAfter)
106 return ns
107 }(),
108 path: "/src/x",
109 want: "b.go:9,suba:0,subb:0,subc:0",
110 }, {
111 desc: "empty_mount",
112 ns: func() vfs.NameSpace {
113 ns := vfs.NameSpace{}
114 ns.Bind("/empty", mapfs.New(nil), "/empty", vfs.BindReplace)
115 return ns
116 }(),
117 path: "/",
118 want: "empty:0",
119 },
120 } {
121 t.Run(tc.desc, func(t *testing.T) {
122 fis, err := tc.ns.ReadDir(tc.path)
123 if err != nil {
124 t.Fatal(err)
125 }
126 buf := &strings.Builder{}
127 sep := ""
128 for _, fi := range fis {
129 fmt.Fprintf(buf, "%s%s:%d", sep, fi.Name(), fi.Size())
130 sep = ","
131 }
132 if got := buf.String(); got != tc.want {
133 t.Errorf("got %q; want %q", got, tc.want)
134 }
135 })
136 }
137 }
138
View as plain text