io driver.ioio cell_spec.io
io listext_spec.io| doFile("listext.io") | |
| Cell := Object clone | |
| Cell x := nil | |
| Cell y := nil | |
| Cell new := method(x, y, | |
| self clone init(x,y) | |
| ) | |
| Cell init := method(x, y, | |
| self x = x | |
| self y = y | |
| self | |
| ) | |
| Cell neighbors := method( | |
| list( | |
| Cell new(self x - 1, self y - 1), | |
| Cell new(self x - 1, self y ), | |
| Cell new(self x - 1, self y + 1), | |
| Cell new(self x , self y - 1), | |
| Cell new(self x , self y + 1), | |
| Cell new(self x + 1, self y - 1), | |
| Cell new(self x + 1, self y ), | |
| Cell new(self x + 1, self y + 1) | |
| ) | |
| ) | |
| Cell living_neighbors := method(grid, | |
| neighbors map(neighbor, | |
| if(grid containsEqual(neighbor), 1, 0) | |
| ) reduce(+) | |
| ) | |
| Cell living := method(grid, | |
| grid containsEqual(self) | |
| ) | |
| Cell birth := method(grid, | |
| living(grid) not and living_neighbors(grid) == 3 | |
| ) | |
| Cell die := method(grid, | |
| living(grid) and (living_neighbors(grid) < 2 or living_neighbors(grid) > 3) | |
| ) | |
| Cell == = method(other, | |
| x == other x and y == other y | |
| ) |
| doFile("spec.io") | |
| cell := nil | |
| before = block( | |
| cell = Cell new(0,0) | |
| ) | |
| it("has 8 neighbors", block( | |
| expect(cell neighbors size) to(equal(8)) | |
| )) | |
| it("has living neighbors", block( | |
| grid := list(Cell new(1,0)) | |
| expect(cell living_neighbors(grid)) to(equal(1)) | |
| )) | |
| it("is living", block( | |
| grid := list(Cell new(0,0)) | |
| expect(cell living(grid)) to(equal(true)) | |
| )) | |
| it("births when dead cell has 3 living neighbors", block( | |
| cell = Cell new(0,1) | |
| grid := list( | |
| Cell new(1,0), | |
| Cell new(1,1), | |
| Cell new(1,2) | |
| ) | |
| expect(cell birth(grid)) to(equal(true)) | |
| )) | |
| it("dies when less than 2 living neighbors", block( | |
| grid := list(cell) | |
| expect(cell die(grid)) to(equal(true)) | |
| )) | |
| it("dies when more than 3 living neighbors", block( | |
| cell = Cell new(0,1) | |
| grid := list( | |
| cell, | |
| Cell new(0,0), | |
| Cell new(1,0), | |
| Cell new(1,1), | |
| Cell new(1,2) | |
| ) | |
| expect(cell die(grid)) to(equal(true)) | |
| )) | |
| it("is equal to another cell with the same coords", block( | |
| other_cell := Cell new(0,0) | |
| expect(other_cell) to(equal(cell)) | |
| )) |
| render := method(grid, | |
| System system("clear") | |
| size := 10 | |
| for(i, 0, size, | |
| for(j, 0, size, | |
| alive := grid containsEqual(Cell new(i,j)) | |
| if(alive, | |
| "0" print, | |
| ) | |
| ) | |
| "" println | |
| ) | |
| ) | |
| blinker := list( | |
| Cell new(0,1), | |
| Cell new(1,1), | |
| Cell new(2,1) | |
| ) | |
| glider := list( | |
| Cell new(1,0), | |
| Cell new(2,1), | |
| Cell new(0,2), | |
| Cell new(1,2), | |
| Cell new(2,2) | |
| ) | |
| grid := glider | |
| loop( | |
| render(grid) | |
| new_grid := grid clone | |
| process := method(cell, | |
| if(cell birth(grid), | |
| new_grid push(cell) | |
| ) | |
| if(cell die(grid), | |
| new_grid remove(cell) | |
| ) | |
| ) | |
| grid foreach(cell, | |
| process(cell) | |
| cell neighbors foreach(neighbor, | |
| process(neighbor) | |
| ) | |
| ) | |
| grid = new_grid | |
| wait(1) | |
| ) |
| EqualityMatcher := Object clone | |
| EqualityMatcher subject := nil | |
| EqualityMatcher init := method(subject, | |
| self subject = subject | |
| self | |
| ) | |
| EqualityMatcher match := method(match, | |
| subject == match | |
| ) |
| Failure := Exception clone | |
| Expectation := Object clone | |
| Expectation subject := nil | |
| Expectation init := method(subject, | |
| self subject = subject | |
| self | |
| ) | |
| Expectation to := method(matcher, | |
| if(matcher match(subject), | |
| "." print, | |
| Failure raise | |
| ) | |
| ) |
| List containsEqual := method(obj, | |
| self map(v, v == obj) reduce(or) | |
| ) |
| doFile("listext.io") | |
| doFile("spec.io") | |
| it("contains equal but not same object", block( | |
| o1 := Object clone | |
| o2 := Object clone | |
| expect(o1 == o2) to(equal(false)) | |
| o1 == = method(other, true) | |
| o2 == = method(other, true) | |
| expect(o1 == o2) to(equal(true)) | |
| list := list(o1) | |
| expect(list containsEqual(o2)) to(equal(true)) | |
| )) |
| before := nil | |
| it := method(description, body, | |
| before ?call | |
| e := try( | |
| body call | |
| ) | |
| e catch(Failure, | |
| "" println | |
| "Failure:" println | |
| description println | |
| ) pass | |
| ) | |
| expect := method(subject, | |
| Expectation clone init(subject) | |
| ) | |
| equal := method(match, | |
| EqualityMatcher clone init(match) | |
| ) |