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