size_test.go (8663B)
1 package render 2 3 import ( 4 "context" 5 "fmt" 6 "math/rand" 7 "testing" 8 9 "git.defalsify.org/vise.git/cache" 10 "git.defalsify.org/vise.git/internal/resourcetest" 11 "git.defalsify.org/vise.git/resource" 12 "git.defalsify.org/vise.git/state" 13 ) 14 15 type testSizeResource struct { 16 *resourcetest.TestResource 17 } 18 19 func newTestSizeResource() *testSizeResource { 20 ctx := context.Background() 21 rs := resourcetest.NewTestResource() 22 tr := &testSizeResource{ 23 TestResource: rs, 24 } 25 rs.AddTemplate(ctx, "small", "one {{.foo}} two {{.bar}} three {{.baz}}") 26 rs.AddTemplate(ctx, "toobug", "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus in mattis lorem. Aliquam erat volutpat. Ut vitae metus.") 27 rs.AddTemplate(ctx, "pages", "one {{.foo}} two {{.bar}} three {{.baz}}\n{{.xyzzy}}") 28 rs.AddTemplate(ctx, "transparent", "{{.out}}") 29 rs.AddLocalFunc("foo", get) 30 rs.AddLocalFunc("bar", get) 31 rs.AddLocalFunc("baz", get) 32 rs.AddLocalFunc("xyzzy", getXyzzy) 33 return tr 34 } 35 36 func get(ctx context.Context, sym string, input []byte) (resource.Result, error) { 37 switch sym { 38 case "foo": 39 return resource.Result{ 40 Content: "inky", 41 }, nil 42 case "bar": 43 return resource.Result{ 44 Content: "pinky", 45 }, nil 46 case "baz": 47 return resource.Result{ 48 Content: "blinky", 49 }, nil 50 } 51 return resource.Result{}, fmt.Errorf("unknown sym: %s", sym) 52 } 53 54 func getXyzzy(ctx context.Context, sym string, input []byte) (resource.Result, error) { 55 r := "inky pinky\nblinky clyde sue\ntinkywinky dipsy\nlala poo\none two three four five six seven\neight nine ten\neleven twelve" 56 return resource.Result{ 57 Content: r, 58 }, nil 59 } 60 61 func TestSizeCheck(t *testing.T) { 62 szr := NewSizer(16) 63 l, ok := szr.Check("foobar") 64 if !ok { 65 t.Fatalf("expected ok") 66 } 67 if l != 10 { 68 t.Fatalf("expected 10, got %v", l) 69 } 70 71 l, ok = szr.Check("inkypinkyblinkyclyde") 72 if ok { 73 t.Fatalf("expected not ok") 74 } 75 if l != 0 { 76 t.Fatalf("expected 0, got %v", l) 77 } 78 } 79 80 func TestSizeLimit(t *testing.T) { 81 st := state.NewState(0) 82 ca := cache.NewCache() 83 mn := NewMenu() 84 rs := newTestSizeResource() 85 rs.Lock() 86 szr := NewSizer(128) 87 pg := NewPage(ca, rs).WithMenu(mn).WithSizer(szr) 88 ca.Push() 89 st.Down("test") 90 err := ca.Add("foo", "inky", 4) 91 if err != nil { 92 t.Fatal(err) 93 } 94 err = ca.Add("bar", "pinky", 10) 95 if err != nil { 96 t.Fatal(err) 97 } 98 err = ca.Add("baz", "blinky", 0) 99 if err != nil { 100 t.Fatal(err) 101 } 102 err = pg.Map("foo") 103 if err != nil { 104 t.Fatal(err) 105 } 106 err = pg.Map("bar") 107 if err != nil { 108 t.Fatal(err) 109 } 110 err = pg.Map("baz") 111 if err != nil { 112 t.Fatal(err) 113 } 114 115 mn.Put("1", "foo the foo") 116 mn.Put("2", "go to bar") 117 118 ctx := context.Background() 119 _, err = pg.Render(ctx, "small", 0) 120 if err != nil { 121 t.Fatal(err) 122 } 123 124 _, err = pg.Render(ctx, "toobig", 0) 125 if err == nil { 126 t.Fatalf("expected size exceeded") 127 } 128 } 129 130 func TestSizePages(t *testing.T) { 131 st := state.NewState(0) 132 ca := cache.NewCache() 133 mn := NewMenu() 134 rs := newTestSizeResource() 135 rs.Lock() 136 szr := NewSizer(128) 137 pg := NewPage(ca, rs).WithSizer(szr).WithMenu(mn) 138 ca.Push() 139 st.Down("test") 140 ca.Add("foo", "inky", 4) 141 ca.Add("bar", "pinky", 10) 142 ca.Add("baz", "blinky", 20) 143 ca.Add("xyzzy", "inky pinky\nblinky clyde sue\ntinkywinky dipsy\nlala poo\none two three four five six seven\neight nine ten\neleven twelve", 0) 144 pg.Map("foo") 145 pg.Map("bar") 146 pg.Map("baz") 147 pg.Map("xyzzy") 148 149 mn.Put("1", "foo the foo") 150 mn.Put("2", "go to bar") 151 152 ctx := context.Background() 153 r, err := pg.Render(ctx, "pages", 0) 154 if err != nil { 155 t.Fatal(err) 156 } 157 158 expect := `one inky two pinky three blinky 159 inky pinky 160 blinky clyde sue 161 tinkywinky dipsy 162 lala poo 163 1:foo the foo 164 2:go to bar` 165 166 if r != expect { 167 t.Fatalf("expected:\n\t%x\ngot:\n\t%x\n", expect, r) 168 } 169 r, err = pg.Render(ctx, "pages", 1) 170 if err != nil { 171 t.Fatal(err) 172 } 173 174 expect = `one inky two pinky three blinky 175 one two three four five six seven 176 eight nine ten 177 eleven twelve 178 1:foo the foo 179 2:go to bar` 180 if r != expect { 181 t.Fatalf("expected:\n\t%s\ngot:\n\t%s\n", expect, r) 182 } 183 184 } 185 186 func TestManySizes(t *testing.T) { 187 for i := 60; i < 160; i++ { 188 st := state.NewState(0) 189 ca := cache.NewCache() 190 mn := NewMenu() //.WithOutputSize(32) 191 rs := newTestSizeResource() //.WithEntryFuncGetter(funcFor).WithTemplateGetter(getTemplate) 192 rs.Lock() 193 //rs := TestSizeResource{ 194 // mrs, 195 //} 196 szr := NewSizer(uint32(i)) 197 pg := NewPage(ca, rs).WithSizer(szr).WithMenu(mn) 198 ca.Push() 199 st.Down("pages") 200 ca.Add("foo", "inky", 10) 201 ca.Add("bar", "pinky", 10) 202 ca.Add("baz", "blinky", 10) 203 ca.Add("xyzzy", "inky pinky\nblinky clyde sue\ntinkywinky dipsy\nlala poo\none two three four five six seven\neight nine ten\neleven twelve", 0) 204 pg.Map("foo") 205 pg.Map("bar") 206 pg.Map("baz") 207 pg.Map("xyzzy") 208 209 ctx := context.Background() 210 _, err := pg.Render(ctx, "pages", 0) 211 if err != nil { 212 t.Fatal(err) 213 } 214 } 215 } 216 217 func TestManySizesMenued(t *testing.T) { 218 for i := 60; i < 160; i++ { 219 st := state.NewState(0) 220 ca := cache.NewCache() 221 mn := NewMenu() //.WithOutputSize(32) 222 rs := newTestSizeResource() 223 rs.Lock() 224 szr := NewSizer(uint32(i)) 225 pg := NewPage(ca, rs).WithSizer(szr).WithMenu(mn) 226 ca.Push() 227 st.Down("pages") 228 ca.Add("foo", "inky", 10) 229 ca.Add("bar", "pinky", 10) 230 ca.Add("baz", "blinky", 10) 231 ca.Add("xyzzy", "inky pinky\nblinky clyde sue\ntinkywinky dipsy\nlala poo\none two three four five six seven\neight nine ten\neleven twelve", 0) 232 pg.Map("foo") 233 pg.Map("bar") 234 pg.Map("baz") 235 pg.Map("xyzzy") 236 mn.Put("0", "yay") 237 mn.Put("12", "nay") 238 239 ctx := context.Background() 240 _, err := pg.Render(ctx, "pages", 0) 241 if err != nil { 242 t.Fatal(err) 243 } 244 } 245 } 246 247 func TestMenuCollideSink(t *testing.T) { 248 ctx := context.Background() 249 ca := cache.NewCache() 250 rs := resourcetest.NewTestResource() 251 rs.AddTemplate(ctx, "foo", "bar") 252 rs.Lock() 253 szr := NewSizer(30) 254 pg := NewPage(ca, rs).WithSizer(szr) 255 ca.Push() 256 257 ca.Add("inky", "pinky", 5) 258 ca.Add("blinky", "clyde", 0) 259 pg.Map("inky") 260 261 mn := NewMenu().WithSink() 262 pg = pg.WithMenu(mn) 263 264 var err error 265 _, err = pg.Render(ctx, "foo", 0) 266 if err != nil { 267 t.Fatal(err) 268 } 269 270 mn = NewMenu().WithSink() 271 pg = pg.WithMenu(mn) 272 pg.Map("blinky") 273 _, err = pg.Render(ctx, "foo", 0) 274 if err == nil { 275 t.Fatalf("expected error") 276 } 277 } 278 279 func TestMenuSink(t *testing.T) { 280 var err error 281 ctx := context.Background() 282 283 ca := cache.NewCache() 284 rs := resourcetest.NewTestResource() 285 rs.AddTemplate(ctx, "foo", "bar {{.baz}}") 286 rs.Lock() 287 szr := NewSizer(45) 288 289 mn := NewMenu().WithSink().WithBrowseConfig(DefaultBrowseConfig()) 290 mn.Put("0", "inky") 291 mn.Put("1", "pinky") 292 mn.Put("22", "blinky") 293 mn.Put("3", "clyde") 294 mn.Put("44", "tinkywinky") 295 296 pg := NewPage(ca, rs).WithSizer(szr).WithMenu(mn) 297 ca.Push() 298 299 ca.Add("baz", "xyzzy", 5) 300 pg.Map("baz") 301 302 r, err := pg.Render(ctx, "foo", 0) 303 if err != nil { 304 t.Fatal(err) 305 } 306 expect := `bar xyzzy 307 0:inky 308 1:pinky 309 22:blinky 310 11:next` 311 if r != expect { 312 t.Fatalf("expected:\n\t%s\ngot:\n\t%s\n", expect, r) 313 } 314 315 mn = NewMenu().WithSink().WithBrowseConfig(DefaultBrowseConfig()) 316 mn.Put("0", "inky") 317 mn.Put("1", "pinky") 318 mn.Put("22", "blinky") 319 mn.Put("3", "clyde") 320 mn.Put("44", "tinkywinky") 321 322 pg = NewPage(ca, rs).WithSizer(szr).WithMenu(mn) 323 ca.Push() 324 325 ca.Add("baz", "xyzzy", 5) 326 pg.Map("baz") 327 328 r, err = pg.Render(ctx, "foo", 1) 329 if err != nil { 330 t.Fatal(err) 331 } 332 expect = `bar xyzzy 333 3:clyde 334 11:next 335 22:previous` 336 if r != expect { 337 t.Fatalf("expected:\n\t%s\ngot:\n\t%s\n", expect, r) 338 } 339 340 mn = NewMenu().WithSink().WithBrowseConfig(DefaultBrowseConfig()) 341 mn.Put("0", "inky") 342 mn.Put("1", "pinky") 343 mn.Put("22", "blinky") 344 mn.Put("3", "clyde") 345 mn.Put("44", "tinkywinky") 346 347 pg = NewPage(ca, rs).WithSizer(szr).WithMenu(mn) 348 ca.Push() 349 350 ca.Add("baz", "xyzzy", 5) 351 pg.Map("baz") 352 353 r, err = pg.Render(ctx, "foo", 2) 354 if err != nil { 355 t.Fatal(err) 356 } 357 expect = `bar xyzzy 358 44:tinkywinky 359 22:previous` 360 if r != expect { 361 t.Fatalf("expected:\n\t%s\ngot:\n\t%s\n", expect, r) 362 } 363 364 } 365 366 func TestMiddlePage(t *testing.T) { 367 ctx := context.Background() 368 st := state.NewState(0) 369 ca := cache.NewCache() 370 mn := NewMenu().WithBrowseConfig(DefaultBrowseConfig()) 371 rs := newTestSizeResource() 372 rs.Lock() 373 content := "" 374 for i := 0; i < 42; i++ { 375 v := rand.Intn(26) 376 b := make([]byte, 3+(v%3)) 377 for ii := 0; ii < len(b); ii++ { 378 b[ii] = uint8(0x41 + v) 379 v = rand.Intn(26) 380 } 381 content += fmt.Sprintf("%d:%s\n", i, string(b)) 382 } 383 content = content[:len(content)-1] 384 385 st.Down("test") 386 387 ca.Push() 388 ca.Add("out", content, 0) 389 szr := NewSizer(160) 390 391 mn.Put("x", "exit") 392 mn.Put("q", "quit") 393 pg := NewPage(ca, rs).WithMenu(mn).WithSizer(szr) 394 pg.Map("out") 395 396 r, err := pg.Render(ctx, "transparent", 2) 397 if err != nil { 398 t.Fatal(err) 399 } 400 fmt.Printf("%s\n", r) 401 }