@@ -139,6 +139,17 @@ public void testIOBattery() {
139139 robot .handleIO (world );
140140 assertEquals (1.0f , vm .popFloat (), 0.0001f );
141141 }
142+
143+ @ Test
144+ public void testIOLazer () {
145+ World world = new World ();
146+ VM vm = robot .getVM ();
147+ vm .pushFloat (1.0f );
148+ vm .push8 (Robot .IO_LASER );
149+ vm .setIO (true );
150+ robot .handleIO (world );
151+ assertEquals (1.0f , robot .getLazer (), 0.0001f );
152+ }
142153
143154 @ Test
144155 public void testIOCompass () {
@@ -213,6 +224,73 @@ public void testMarkOffset() {
213224 assertEquals (42 , vm .pop8 ());
214225 }
215226
227+ @ Test
228+ public void testSensorNothing () {
229+ World world = generateEmptyWorld ((int ) robot .getX (), (int ) robot .getY (), Robot .RAY_RANGE + 10 );
230+ world .addRobot (robot );
231+ VM vm = robot .getVM ();
232+
233+ vm .push8 (Robot .IO_SENSOR );
234+ vm .setIO (true );
235+ robot .handleIO (world );
236+
237+ assertEquals (vm .pop8 () & 0b111111, 0 );
238+ assertEquals (vm .popFloat (), Robot .RAY_RANGE , 5.0f );
239+ }
240+
241+ @ Test
242+ public void testSensorWall () {
243+ testSensorHitTile (Cell .TILE_WALL , Robot .SENSOR_WALL );
244+ }
245+
246+ @ Test
247+ public void testSensorObstacle () {
248+ testSensorHitTile (Cell .TILE_OBSTACLE , Robot .SENSOR_OBSTACLE );
249+ }
250+
251+ @ Test
252+ public void testSensorHazard () {
253+ testSensorHitTile (Cell .TILE_HAZARD , Robot .SENSOR_HAZARD );
254+ }
255+
256+ protected void testSensorHitTile (int tile , int expectedSensorValue ) {
257+ World world = generateEmptyWorld ((int ) robot .getX (), (int ) robot .getY (), 100 );
258+ world .addRobot (robot );
259+ VM vm = robot .getVM ();
260+ float xOffset = 60.0f ;
261+ world .setTileXY (robot .getX () + xOffset , robot .getY (), tile );
262+
263+ vm .push8 (Robot .IO_SENSOR );
264+ vm .setIO (true );
265+ robot .handleIO (world );
266+ // Saw a wall...
267+ assertEquals (vm .pop8 () & 0b111111, expectedSensorValue );
268+ // ...closeby.
269+ assertEquals (vm .popFloat (), xOffset , World .TILE_SIZE );
270+ }
271+
272+ @ Test
273+ public void testSensorOtherBot () {
274+ World world = generateEmptyWorld ((int ) robot .getX (), (int ) robot .getY (), 50 );
275+ world .addRobot (robot );
276+ VM vm = robot .getVM ();
277+
278+ float xOffset = 30.0f ;
279+
280+ Robot dummy = new Robot (13 );
281+ dummy .position (robot .getX () + xOffset , robot .getY ());
282+ world .addRobot (dummy );
283+
284+ vm .push8 (Robot .IO_SENSOR );
285+ vm .setIO (true );
286+ robot .handleIO (world );
287+ // Saw a robot...
288+ assertEquals (vm .pop8 () & 0b111111, Robot .SENSOR_ROBOT );
289+ // ...closeby.
290+ assertEquals (vm .popFloat (), xOffset , Robot .COLLIDE_RANGE );
291+ }
292+
293+ @ Test
216294 public void testBeamAngle () {
217295 World world = generateEmptyWorld ((int ) robot .getX (), (int ) robot .getY (), 50 );
218296 VM vm = robot .getVM ();
@@ -234,6 +312,20 @@ public void testBeamAngle() {
234312 robot .handleIO (world );
235313 assertEquals ((float )-Math .PI * 0.75f , robot .getBeamAngle (), 0.0001f );
236314 }
315+
316+ @ Test
317+ public void testLazerDamage () {
318+ World world = generateEmptyWorld ((int ) robot .getX (), (int ) robot .getY (), 50 );
319+ Robot dummy = new Robot (13 );
320+ dummy .position (robot .getX () + 30 , robot .getY ());
321+ world .addRobot (robot );
322+ world .addRobot (dummy );
323+
324+ int initialBattery = dummy .getBattery ();
325+ robot .setLazer (1.0f );
326+ robot .tick (world );
327+ assert (dummy .getBattery () < initialBattery );
328+ }
237329
238330 private World generateEmptyWorld (int x , int y , int radius ) {
239331 World world = new World ();
0 commit comments