/** * Tests broadcasting from and to unreliable agents. */ @Test public void testBroadcastUnreliable() { final Agent unreliable = new Agent(new Point(5, 5), 0); model.register(unreliable); unreliable.device().broadcast(Contents.YO); model.afterTick(TimeLapseFactory.create(0, 100)); assertTrue(agent1.device().getUnreadMessages().isEmpty()); assertTrue(agent2.device().getUnreadMessages().isEmpty()); agent1.device().broadcast(Contents.YO); model.afterTick(TimeLapseFactory.create(0, 100)); assertTrue(unreliable.device().getUnreadMessages().isEmpty()); assertEquals(1, agent2.device().getUnreadMessages().size()); }
agent1.device().send(Contents.YO, agent2); agent2.device().send(Contents.HELLO_WORLD, agent1); assertThat(agent1.device().getOutbox()).hasSize(1); assertThat(agent2.device().getOutbox()).hasSize(1); assertThat(agent1.device().getReceivedCount()).isEqualTo(0); assertThat(agent2.device().getReceivedCount()).isEqualTo(0); assertThat(agent1.device().getOutbox()).hasSize(0); assertThat(agent2.device().getOutbox()).hasSize(1); agent2.device().send(Contents.YO, agent1); } catch (final IllegalStateException e) { fail = true; agent2.device().broadcast(Contents.YO); } catch (final IllegalStateException e) { fail = true; agent2.device().clearOutbox(); } catch (final IllegalStateException e) { fail = true;
final Agent rangedNoPos = new RangedAgent(null, 5); final Agent ranged = new RangedAgent(new Point(1, 1), 5); final Agent noPos = new Agent(null); assertFalse(rangedNoPos.getPosition().isPresent()); model.register(rangedNoPos); model.register(ranged); rangedNoPos.device().send(Contents.YO, agent1); model.afterTick(TimeLapseFactory.create(0, 100)); assertEquals(0, agent1.device().getReceivedCount()); assertEquals(0, agent1.device().getUnreadCount()); assertEquals(1, rangedNoPos.device().getOutbox().size()); rangedNoPos.device().broadcast(Contents.YO); model.afterTick(TimeLapseFactory.create(0, 100)); assertEquals(0, agent1.device().getReceivedCount()); assertEquals(0, agent2.device().getReceivedCount()); assertEquals(0, agent3.device().getReceivedCount()); assertEquals(0, agent4.device().getReceivedCount()); assertEquals(0, agent5.device().getReceivedCount()); assertEquals(0, ranged.device().getReceivedCount()); assertEquals(0, noPos.device().getReceivedCount()); assertEquals(2, rangedNoPos.device().getOutbox().size()); final List<Message> msgs = rangedNoPos.device().getOutbox(); assertFalse(msgs.get(0).isBroadcast()); assertTrue(msgs.get(1).isBroadcast()); assertEquals(0, rangedNoPos.device().getReceivedCount()); agent1.device().send(Contents.YO, rangedNoPos);
agent1.device().broadcast(Contents.HELLO_WORLD); assertTrue(agent1.device().getUnreadMessages().isEmpty()); assertTrue(agent2.device().getUnreadMessages().isEmpty()); assertTrue(agent3.device().getUnreadMessages().isEmpty()); assertTrue(agent4.device().getUnreadMessages().isEmpty()); assertTrue(agent5.device().getUnreadMessages().isEmpty()); assertTrue(agent1.device().getUnreadMessages().isEmpty()); final List<Message> msgs2 = agent2.device().getUnreadMessages(); final List<Message> msgs3 = agent3.device().getUnreadMessages(); final List<Message> msgs4 = agent4.device().getUnreadMessages(); final List<Message> msgs5 = agent5.device().getUnreadMessages(); assertSame(msgs2.get(0), msgs5.get(0)); assertTrue(agent1.device().getUnreadMessages().isEmpty()); assertTrue(agent2.device().getUnreadMessages().isEmpty()); assertTrue(agent3.device().getUnreadMessages().isEmpty()); assertTrue(agent4.device().getUnreadMessages().isEmpty()); assertTrue(agent5.device().getUnreadMessages().isEmpty());
/** * Tests that the messages appear in the device in the actual send ordering, * which is the order in which agents have been registered in the comm model * and not the order of broadcast invocation. */ @Test public void testBroadcastReceiveOrdering() { agent4.device().broadcast(Contents.YO); agent1.device().broadcast(Contents.HELLO_WORLD); agent2.device().broadcast(Contents.YO); agent1.device().broadcast(Contents.HELLO_WORLD); agent3.device().broadcast(Contents.YO); agent4.device().broadcast(Contents.YO); model.afterTick(TimeLapseFactory.create(0, 100)); final List<Message> msgs = agent5.device().getUnreadMessages(); assertSame(agent1, msgs.get(0).getSender()); assertSame(agent1, msgs.get(1).getSender()); assertSame(agent2, msgs.get(2).getSender()); assertSame(agent3, msgs.get(3).getSender()); assertSame(agent4, msgs.get(4).getSender()); assertSame(agent4, msgs.get(5).getSender()); }
/** * Tests what happens if an agent no longer has a position. */ @Test public void testSenderIsRemovedDuringSend() { final Agent a = new Agent(new Point(0, 0)); final Agent b = new RangedAgent(new Point(0, 0), 5); model.register(a); model.register(b); // a is removed during the same tick as that it sends a message, this // doesn't matter since it has no range, therefore it sends anyway. a.device().broadcast(Contents.YO); a.setPosition(null); model.afterTick(TimeLapseFactory.create(0, 100)); assertEquals(1, agent1.device().getReceivedCount()); // b is removed during the same tick as that is sends a message, since it is // a ranged device the message is not sent and will stay in the outbox. b.device().broadcast(Contents.YO); b.setPosition(null); model.afterTick(TimeLapseFactory.create(0, 100)); assertEquals(1, agent1.device().getReceivedCount()); assertEquals(1, b.device().getOutbox().size()); }
/** * Tests that the same device is used again upon re-registering. */ @Test public void testRegisterUnregistered() { final ListenerEventHistory leh = new ListenerEventHistory(); model.getEventAPI().addListener(leh, EventTypes.ADD_COMM_USER, EventTypes.REMOVE_COMM_USER); final CommDevice originalDevice = agent1.device(); assertThat(model.contains(agent1)).isTrue(); model.unregister(agent1); assertThat(model.contains(agent1)).isFalse(); assertThat(leh.getEventTypeHistory()).containsExactly(REMOVE_COMM_USER) .inOrder(); model.register(agent1); assertThat(model.contains(agent1)).isTrue(); final CommDevice newDevice = agent1.device(); assertThat(originalDevice).isSameAs(newDevice); assertThat(leh.getEventTypeHistory()).containsExactly(REMOVE_COMM_USER, ADD_COMM_USER) .inOrder(); newDevice.broadcast(Contents.HELLO_WORLD); }
/** * Test input validation. */ @Test public void testSendDirectMsgInputValidation() { boolean fail = false; try { agent1.device().send(Contents.YO, agent1); } catch (final IllegalArgumentException e) { fail = true; } assertTrue(fail); fail = false; final Agent unknown = new Agent(new Point(0, 0)); try { agent1.device().send(Contents.YO, unknown); } catch (final IllegalArgumentException e) { fail = true; } assertTrue(fail); }
/** * Test for send message with limited range. */ @Test public void testSendDirectMsgWithRange() { final Agent ranged = new RangedAgent(new Point(0, 5), 5); model.register(ranged); // is possible, is within range ranged.device().send(Contents.YO, agent1); // not possible, too far ranged.device().send(Contents.YO, agent3); // receiving messages from outside range is possible agent3.device().send(Contents.YO, ranged); model.afterTick(TimeLapseFactory.create(0, 100)); final Message m = agent1.device().getUnreadMessages().get(0); assertSame(ranged, m.getSender()); assertTrue(agent3.device().getUnreadMessages().isEmpty()); assertSame(agent3, ranged.device().getUnreadMessages().get(0) .getSender()); }
/** * Set up a simple and reliable world. */ @Before public void setUp() { model = CommModel .builder() .withDefaultDeviceReliability(1.0) .build(fakeDependencies()); agent1 = new Agent(new Point(0, 0)); agent2 = new Agent(new Point(0, 10)); agent3 = new Agent(new Point(5, 10)); agent4 = new Agent(new Point(5, 5)); agent5 = new Agent(new Point(5, 0)); model.register(agent1); model.register(agent2); model.register(agent3); model.register(agent4); model.register(agent5); TestUtil.testEnum(CommModel.EventTypes.class); }
/** * Tests the correct sending and receiving of a direct message. */ @Test public void testSendDirectMsg() { agent1.device().send(Contents.YO, agent2); assertTrue(agent2.device().getUnreadMessages().isEmpty()); // send messages model.afterTick(TimeLapseFactory.create(0, 100)); assertTrue(agent1.device().getUnreadMessages().isEmpty()); final List<Message> msgs = agent2.device().getUnreadMessages(); assertEquals(1, msgs.size()); assertFalse(msgs.get(0).toString().isEmpty()); assertSame(Contents.YO, msgs.get(0).getContents()); assertSame(agent1, msgs.get(0).getSender()); assertTrue(agent2.device().getUnreadMessages().isEmpty()); }
/** * Test that a broadcast only ends up at agents within the range. */ @Test public void testBroadcastWithRange() { final Agent ranged = new RangedAgent(new Point(0, 5), 5); model.register(ranged); ranged.device().broadcast(Contents.YO); model.afterTick(TimeLapseFactory.create(0, 100)); assertFalse(agent1.device().getUnreadMessages().isEmpty()); assertFalse(agent2.device().getUnreadMessages().isEmpty()); assertTrue(agent3.device().getUnreadMessages().isEmpty()); assertFalse(agent4.device().getUnreadMessages().isEmpty()); assertTrue(agent5.device().getUnreadMessages().isEmpty()); }
/** * Tests that the returned list is unmodifiable. */ @Test public void testUnmodifiableUnreadMessages() { final List<Message> msgs = agent1.device().getUnreadMessages(); boolean fail = false; try { msgs.clear(); } catch (final UnsupportedOperationException e) { fail = true; } assertTrue(fail); }
/** * Test for unreliable direct message. */ @Test public void testSendDirectMsgUnreliable() { final Agent unreliable = new Agent(new Point(5, 5), 0); model.register(unreliable); unreliable.device().send(Contents.YO, agent1); model.afterTick(TimeLapseFactory.create(0, 100)); assertTrue(agent1.device().getUnreadMessages().isEmpty()); agent1.device().send(Contents.YO, unreliable); model.afterTick(TimeLapseFactory.create(0, 100)); assertTrue(unreliable.device().getUnreadMessages().isEmpty()); }