go-vise

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

size_test.go (8936B)


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