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  }