tdo

Dicing the onion
git clone git@abtrout.com:tdo.git
Log | Files | Refs | README

tomtel_test.go (4119B)


      1 package tdo
      2 
      3 import "testing"
      4 
      5 func TestParseMv(t *testing.T) {
      6 	tests := []struct {
      7 		input    uint8
      8 		wantOk   bool
      9 		wantDest uint8
     10 		wantSrc  uint8
     11 	}{
     12 		{0b01011110, true, 0b011, 0b110},
     13 		{0b01101110, true, 0b101, 0b110},
     14 		{0b11000000, false, 0, 0},
     15 		{0b00000000, false, 0, 0},
     16 	}
     17 
     18 	for _, test := range tests {
     19 		ok, dest, src := parseMv(test.input)
     20 		if ok != test.wantOk || dest != test.wantDest || src != test.wantSrc {
     21 			t.Errorf("parseMv(%08b) = %t, %d, %d; want %t, %d, %d", test.input, ok, dest, src, test.wantOk, test.wantDest, test.wantSrc)
     22 		}
     23 	}
     24 }
     25 
     26 func TestParseMvi(t *testing.T) {
     27 	tests := []struct {
     28 		input    uint8
     29 		wantOk   bool
     30 		wantDest uint8
     31 	}{
     32 		{0b01111000, true, 0b111},
     33 		{0b01101000, true, 0b101},
     34 		{0b01111001, false, 0},
     35 		{0b01111111, false, 0},
     36 		{0b00000000, false, 0},
     37 		{0b11000000, false, 0},
     38 	}
     39 
     40 	for _, test := range tests {
     41 		ok, dest := parseMvi(test.input)
     42 		if ok != test.wantOk || dest != test.wantDest {
     43 			t.Errorf("parseMvi(%08b) = %t, %d; want %t, %d", test.input, ok, dest, test.wantOk, test.wantDest)
     44 		}
     45 	}
     46 }
     47 
     48 func TestParseMv32(t *testing.T) {
     49 	tests := []struct {
     50 		input    uint8
     51 		wantOk   bool
     52 		wantDest uint8
     53 		wantSrc  uint8
     54 	}{
     55 		{0b10011110, true, 0b011, 0b110},
     56 		{0b10101110, true, 0b101, 0b110},
     57 		{0b10111000, false, 0, 0},
     58 		{0b11111111, false, 0, 0},
     59 		{0b01000000, false, 0, 0},
     60 	}
     61 
     62 	for _, test := range tests {
     63 		ok, dest, src := parseMv32(test.input)
     64 		if ok != test.wantOk || dest != test.wantDest || src != test.wantSrc {
     65 			t.Errorf("parseMv32(%08b) = %t, %d, %d; want %t, %d, %d", test.input, ok, dest, src, test.wantOk, test.wantDest, test.wantSrc)
     66 		}
     67 	}
     68 }
     69 
     70 func TestParseMvi32(t *testing.T) {
     71 	tests := []struct {
     72 		input    uint8
     73 		wantOk   bool
     74 		wantDest uint8
     75 	}{
     76 		{0b10111000, true, 0b111},
     77 		{0b10101000, true, 0b101},
     78 		{0b00000000, false, 0},
     79 		{0b11000000, false, 0},
     80 		{0b10111111, false, 0},
     81 	}
     82 
     83 	for _, test := range tests {
     84 		ok, dest := parseMvi32(test.input)
     85 		if ok != test.wantOk || dest != test.wantDest {
     86 			t.Errorf("parseMvi32(%08b) = %t, %d; want %t, %d", test.input, ok, dest, test.wantOk, test.wantDest)
     87 		}
     88 	}
     89 }
     90 
     91 func TestTomtel_HelloWorld(t *testing.T) {
     92 	code := []byte{
     93 		// 50 48  # MVI b <- 72
     94 		0x50, 0x48,
     95 		// C2     # ADD a <- b
     96 		0xC2,
     97 		// 02     # OUT a
     98 		0x02,
     99 		// A8 4D 00 00 00  # MVI32 ptr <- 0x0000004d
    100 		0xA8, 0x4D, 0x00, 0x00, 0x00,
    101 		// 4F     # MV a <- (ptr+c)
    102 		0x4F,
    103 		// 02     # OUT a
    104 		0x02,
    105 		// 50 09  # MVI b <- 9
    106 		0x50, 0x09,
    107 		// C4     # XOR a <- b
    108 		0xC4,
    109 		// 02     # OUT a
    110 		0x02,
    111 		// 02     # OUT a
    112 		0x02,
    113 		// E1 01  # APTR 0x00000001
    114 		0xE1, 0x01,
    115 		// 4F     # MV a <- (ptr+c)
    116 		0x4F,
    117 		// 02     # OUT a
    118 		0x02,
    119 		// C1     # CMP
    120 		0xC1,
    121 		// 22 1D 00 00 00  # JNZ 0x0000001d
    122 		0x22, 0x1D, 0x00, 0x00, 0x00,
    123 		// 48 30  # MVI a <- 48
    124 		0x48, 0x30,
    125 		// 02     # OUT a
    126 		0x02,
    127 		// 58 03  # MVI c <- 3
    128 		0x58, 0x03,
    129 		// 4F     # MV a <- (ptr+c)
    130 		0x4F,
    131 		// 02     # OUT a
    132 		0x02,
    133 		// B0 29 00 00 00  # MVI32 pc <- 0x00000029
    134 		0xB0, 0x29, 0x00, 0x00, 0x00,
    135 		// 48 31  # MVI a <- 49
    136 		0x48, 0x31,
    137 		// 02     # OUT a
    138 		0x02,
    139 		// 50 0C  # MVI b <- 12
    140 		0x50, 0x0C,
    141 		// C3     # SUB a <- b
    142 		0xC3,
    143 		// 02     # OUT a
    144 		0x02,
    145 		// AA     # MV32 ptr <- lb
    146 		0xAA,
    147 		// 57     # MV b <- (ptr+c)
    148 		0x57,
    149 		// 48 02  # MVI a <- 2
    150 		0x48, 0x02,
    151 		// C1     # CMP
    152 		0xC1,
    153 		// 21 3A 00 00 00  # JEZ 0x0000003a
    154 		0x21, 0x3A, 0x00, 0x00, 0x00,
    155 		// 48 32  # MVI a <- 50
    156 		0x48, 0x32,
    157 		// 02     # OUT a
    158 		0x02,
    159 		// 48 77  # MVI a <- 119
    160 		0x48, 0x77,
    161 		// 02     # OUT a
    162 		0x02,
    163 		// 48 6F  # MVI a <- 111
    164 		0x48, 0x6F,
    165 		// 02     # OUT a
    166 		0x02,
    167 		// 48 72  # MVI a <- 114
    168 		0x48, 0x72,
    169 		// 02     # OUT a
    170 		0x02,
    171 		// 48 6C  # MVI a <- 108
    172 		0x48, 0x6C,
    173 		// 02     # OUT a
    174 		0x02,
    175 		// 48 64  # MVI a <- 100
    176 		0x48, 0x64,
    177 		// 02     # OUT a
    178 		0x02,
    179 		// 48 21  # MVI a <- 33
    180 		0x48, 0x21,
    181 		// 02     # OUT a
    182 		0x02,
    183 		// 01     # HALT
    184 		0x01,
    185 		// 65 6F 33 34 2C  # non-instruction data
    186 		0x65, 0x6F, 0x33, 0x34, 0x2C,
    187 	}
    188 
    189 	tom := NewTomtel(code)
    190 	out := tom.Run()
    191 	if string(out) != "Hello, world!" {
    192 		t.Errorf("Unexpected output: %v", string(out))
    193 	}
    194 }