1package asmgotostate 2 3import ( 4 "strings" 5 "testing" 6) 7 8func TestGoto(t *testing.T) { 9 cases := []struct { 10 input string 11 expected string 12 err string 13 }{ 14 { 15 input: `noop`, 16 expected: `noop`, 17 err: ``, 18 }, 19 { 20 input: `unused: noop`, 21 expected: `noop`, 22 err: ``, 23 }, 24 { 25 input: `self: jump self`, 26 expected: `jump 0`, 27 err: ``, 28 }, 29 { 30 input: `prev: noop 31jump prev`, 32 expected: `noop 33jump -1`, 34 err: ``, 35 }, 36 { 37 input: `jump next 38next: noop`, 39 expected: `jump 1 40noop`, 41 err: ``, 42 }, 43 { 44 input: `start: noop 45jump start 46jump start 47jump start 48noop`, 49 expected: `noop 50jump -1 51jump -2 52jump -3 53noop`, 54 err: ``, 55 }, 56 { 57 input: `jump end 58jump end 59jump end 60end: jump end`, 61 expected: `jump 3 62jump 2 63jump 1 64jump 0`, 65 err: ``, 66 }, 67 { 68 input: `noop 69jump l1 70l3: noop 71jump l2 72noop 73l1: jump l3 74l2: noop`, 75 expected: `noop 76jump 4 77noop 78jump 3 79noop 80jump -3 81noop`, 82 err: ``, 83 }, 84 { 85 input: `jump undefined`, 86 expected: ``, 87 err: `jump to undefined label 'undefined' found`, 88 }, 89 { 90 input: `multidefined: noop 91multidefined: noop`, 92 expected: ``, 93 err: `label 'multidefined' already defined on line 1`, 94 }, 95 } 96 97 for _, test := range cases { 98 ll := make(labelLookup) 99 got, err := Parse("", []byte(test.input), InitState("labelLookup", ll)) 100 if err != nil { 101 if !strings.Contains(err.Error(), test.err) { 102 t.Fatalf("Parse error did not match, expected: %s, got %s, input:\n%s\n", test.err, err, test.input) 103 } 104 } else { 105 instr := got.([]Instruction) 106 result := "" 107 for _, inst := range instr { 108 result += inst.Assemble() + "\n" 109 } 110 result = strings.Trim(result, "\n") 111 if result != test.expected { 112 t.Fatalf("Parse did not provide expected result, expected:\n%s\n\nOutput:\n%s\n", test.expected, result) 113 } 114 } 115 } 116} 117