go-vise

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

testdata.go (5357B)


      1 package testdata
      2 
      3 import (
      4 	"fmt"
      5 	"io/ioutil"
      6 	"os"
      7 	"path"
      8 
      9 	testdataloader "github.com/peteole/testdata-loader"
     10 
     11 	"git.defalsify.org/vise.git/vm"
     12 )
     13 
     14 type genFunc func() error
     15 
     16 var (
     17 	BaseDir = testdataloader.GetBasePath()
     18 	DataDir = ""
     19 	dirLock = false	
     20 )
     21 
     22 func out(sym string, b []byte, tpl string, data map[string]string) error {
     23 	fp := path.Join(DataDir, sym)
     24 	err := ioutil.WriteFile(fp, []byte(tpl), 0644)
     25 	if err != nil {
     26 		return err
     27 	}
     28 
     29 	fb := sym + ".bin"
     30 	fp = path.Join(DataDir, fb)
     31 	err = ioutil.WriteFile(fp, b, 0644)
     32 	if err != nil {
     33 		return err
     34 	}
     35 
     36 	if data == nil {
     37 		return nil
     38 	}
     39 
     40 	for k, v := range data {
     41 		fb := k + ".txt"
     42 		fp = path.Join(DataDir, fb)
     43 		err = ioutil.WriteFile(fp, []byte(v), 0644)
     44 		if err != nil {
     45 			return err
     46 		}
     47 	}
     48 
     49 	return nil
     50 }
     51 
     52 func root() error {
     53 	b := []byte{}
     54 	b = vm.NewLine(b, vm.MOUT, []string{"1", "do the foo"}, nil, nil)
     55 	b = vm.NewLine(b, vm.MOUT, []string{"2", "go to the bar"}, nil, nil)
     56 	b = vm.NewLine(b, vm.MOUT, []string{"3", "language template"}, nil, nil)
     57 	b = vm.NewLine(b, vm.HALT, nil, nil, nil)
     58 	b = vm.NewLine(b, vm.INCMP, []string{"foo", "1"}, nil, nil)
     59 	b = vm.NewLine(b, vm.INCMP, []string{"bar", "2"}, nil, nil)
     60 	b = vm.NewLine(b, vm.INCMP, []string{"lang", "3"}, nil, nil)
     61 
     62 	tpl := "hello world"
     63 
     64 	return out("root", b, tpl, nil)
     65 }
     66 
     67 func foo() error {
     68 	b := []byte{}
     69 	b = vm.NewLine(b, vm.MOUT, []string{"0", "to foo"}, nil, nil)
     70 	b = vm.NewLine(b, vm.MOUT, []string{"1", "go bar"}, nil, nil)
     71 	b = vm.NewLine(b, vm.MOUT, []string{"2", "see long"}, nil, nil)
     72 	b = vm.NewLine(b, vm.LOAD, []string{"inky"}, []byte{20}, nil)
     73 	b = vm.NewLine(b, vm.HALT, nil, nil, nil)
     74 	b = vm.NewLine(b, vm.INCMP, []string{"_", "0"}, nil, nil)
     75 	b = vm.NewLine(b, vm.INCMP, []string{"baz", "1"}, nil, nil)
     76 	b = vm.NewLine(b, vm.INCMP, []string{"long", "2"}, nil, nil)
     77 
     78 	data := make(map[string]string)
     79 	data["inky"] = "one"
     80 
     81 	tpl := `this is in foo
     82 
     83 it has more lines`
     84 
     85 	return out("foo", b, tpl, data)
     86 }
     87 
     88 func bar() error {
     89 	b := []byte{}
     90 	b = vm.NewLine(b, vm.LOAD, []string{"pinky"}, []byte{0}, nil)
     91 	b = vm.NewLine(b, vm.HALT, nil, nil, nil)
     92 	b = vm.NewLine(b, vm.INCMP, []string{"^", "*"}, nil, nil)
     93 
     94 	tpl := "this is bar - any input will return to top"
     95 
     96 	data := make(map[string]string)
     97 	data["pinky"] = "two"
     98 
     99 	return out("bar", b, tpl, data)
    100 }
    101 
    102 func baz() error {
    103 	b := []byte{}
    104 	b = vm.NewLine(b, vm.MAP, []string{"inky"}, nil, nil)
    105 	b = vm.NewLine(b, vm.HALT, nil, nil, nil)
    106 
    107 	tpl := "this is baz which uses the var {{.inky}} in the template."
    108 
    109 	return out("baz", b, tpl, nil)
    110 }
    111 
    112 func long() error {
    113 	b := []byte{}
    114 	b = vm.NewLine(b, vm.MOUT, []string{"0", "back"}, nil, nil)
    115 	b = vm.NewLine(b, vm.MNEXT, []string{"00", "nexxt"}, nil, nil)
    116 	b = vm.NewLine(b, vm.MPREV, []string{"11", "prevvv"}, nil, nil)
    117 	b = vm.NewLine(b, vm.LOAD, []string{"longdata"}, []byte{0x00}, nil)
    118 	b = vm.NewLine(b, vm.MAP, []string{"longdata"}, nil, nil)
    119 	b = vm.NewLine(b, vm.HALT, nil, nil, nil)
    120 	b = vm.NewLine(b, vm.INCMP, []string{"_", "0"}, nil, nil)
    121 	b = vm.NewLine(b, vm.INCMP, []string{">", "00"}, nil, nil)
    122 	b = vm.NewLine(b, vm.INCMP, []string{"<", "11"}, nil, nil)
    123 
    124 	tpl := `data
    125 {{.longdata}}`
    126 
    127 	data := make(map[string]string)
    128 	data["longdata"] = `INKY 12
    129 PINKY 5555
    130 BLINKY 3t7
    131 CLYDE 11
    132 TINKYWINKY 22
    133 DIPSY 666
    134 LALA 111
    135 POO 222
    136 `
    137 
    138 	return out("long", b, tpl, data)
    139 }
    140 
    141 func defaultCatch() error {
    142 	b := []byte{}
    143 	b = vm.NewLine(b, vm.MOUT, []string{"0", "back"}, nil, nil)
    144 	b = vm.NewLine(b, vm.HALT, nil, nil, nil)
    145 	b = vm.NewLine(b, vm.INCMP, []string{"_", "*"}, nil, nil)
    146 
    147 	tpl := "invalid input"
    148 
    149 	return out("_catch", b, tpl, nil)
    150 }
    151 
    152 func lang() error {
    153 	b := []byte{}
    154 	b = vm.NewLine(b, vm.MOUT, []string{"0", "back"}, nil, nil)
    155 	b = vm.NewLine(b, vm.LOAD, []string{"inky"}, []byte{20}, nil)
    156 	b = vm.NewLine(b, vm.MAP, []string{"inky"}, nil, nil)
    157 	b = vm.NewLine(b, vm.HALT, nil, nil, nil)
    158 	b = vm.NewLine(b, vm.INCMP, []string{"_", "*"}, nil, nil)
    159 
    160 	tpl := "this changes with language {{.inky}}"
    161 
    162 	err := out("lang", b, tpl, nil)
    163 	if err != nil {
    164 		return err
    165 	}
    166 
    167 	tpl = "dette endrer med språket {{.inky}}"
    168 	fp := path.Join(DataDir, "lang_nor")
    169 	err = os.WriteFile(fp, []byte(tpl), 0600)
    170 	if err != nil {
    171 		return err
    172 	}
    173 
    174 	menu := "tilbake"
    175 	fp = path.Join(DataDir, "back_menu_nor")
    176 	return os.WriteFile(fp, []byte(menu), 0600)
    177 }
    178 
    179 func generate() error {
    180 	err := os.MkdirAll(DataDir, 0755)
    181 	if err != nil {
    182 		return err
    183 	}
    184 
    185 	fns := []genFunc{root, foo, bar, baz, long, lang, defaultCatch}
    186 	for _, fn := range fns {
    187 		err = fn()
    188 		if err != nil {
    189 			return err
    190 		}
    191 	}
    192 	return nil
    193 }
    194 
    195 // Generate outputs bytecode, templates and content symbols to a temporary directory.
    196 //
    197 // This directory can in turn be used as data source for the the resource.FsResource object.
    198 func Generate() (string, error) {
    199 	dir, err := ioutil.TempDir("", "vise_testdata_")
    200 	if err != nil {
    201 		return "", err
    202 	}
    203 	DataDir = dir
    204 	dirLock = true
    205 	err = generate()
    206 	return dir, err
    207 }
    208 
    209 
    210 // Generate outputs bytecode, templates and content symbols to a specified directory.
    211 //
    212 // The directory must exist, and must not have been used already in the same code execution.
    213 //
    214 // This directory can in turn be used as data source for the the resource.FsResource object.
    215 func GenerateTo(dir string) error {
    216 	if dirLock {
    217 		return fmt.Errorf("directory already overridden")
    218 	}
    219 	DataDir = dir
    220 	dirLock = true
    221 	return generate()
    222 }