go-vise

Constrained Size Output Virtual Machine
Info | Log | Files | Refs | README | LICENSE

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 }