github.com/jflude/taocp@v0.0.0-20240210234939-99f2a91af3c2/mix/io_test.go (about) 1 package mix 2 3 import "testing" 4 5 func TestIO(t *testing.T) { 6 c, tmpDir := newSandbox(t, "") 7 defer closeSandbox(t, c, tmpDir) 8 9 if err := c.bindDevice(Drum10Unit); err != nil { 10 t.Fatal("error:", err) 11 } 12 drum := c.Devices[Drum10Unit] 13 buf := make([]Word, drum.BlockSize()) 14 for i := 0; i < 10; i++ { 15 for j := range buf { 16 buf[j] = NewWord(100*i + j) 17 } 18 c.Reg[X] = NewWord(10 * i) 19 if _, err := drum.Write(buf); err != nil { 20 t.Error("error:", err) 21 } 22 } 23 for i := 0; i < 10; i++ { 24 c.Reg[X] = NewWord(10 * i) 25 if _, err := drum.Read(buf); err != nil { 26 t.Error("error:", err) 27 } 28 for j, v := range buf { 29 want := 100*i + j 30 if v.Int() != want { 31 t.Errorf("#%d.%d: got: %d, want: %d", 32 i, j, v.Int(), want) 33 break 34 } 35 } 36 } 37 38 if err := c.bindDevice(Tape2Unit); err != nil { 39 t.Fatal("error:", err) 40 } 41 tape := c.Devices[Tape2Unit] 42 buf = make([]Word, tape.BlockSize()) 43 for i := 0; i < 10; i++ { 44 for j := range buf { 45 buf[j] = NewWord(100*i + j) 46 } 47 if _, err := tape.Write(buf); err != nil { 48 t.Error("error:", err) 49 } 50 } 51 if _, err := tape.Control(0); err != nil { 52 t.Error("error:", err) 53 } 54 if _, err := tape.Control(1); err != nil { 55 t.Error("error:", err) 56 } 57 if _, err := tape.Control(1); err != nil { 58 t.Error("error:", err) 59 } 60 for i := 2; i < 10; i++ { 61 if _, err := tape.Read(buf); err != nil { 62 t.Error("error:", err) 63 } 64 for j, v := range buf { 65 want := 100*i + j 66 if v.Int() != want { 67 t.Errorf("got: %d, want: %d", 68 v.Int(), want) 69 break 70 } 71 } 72 } 73 }