@Test
  public void record_average_with_two_model_stats_information_from_simple_vertices_should_change() {
    VertexStatsRecorder recorder = new VertexStatsRecorder();

    Vertex simple = VertexFactory.makeSimpleVertex();
    Vertex simple2 = VertexFactory.makeSimpleVertex();
    Vertex simple3 = VertexFactory.makeSimpleVertex();
    Vertex simple4 = VertexFactory.makeSimpleVertex();

    simple.addNeighbour(simple2).addNeighbour(simple3).addNeighbour(simple4);

    simple2.addNeighbour(simple3).addNeighbour(simple4);

    simple3.addNeighbour(simple4);

    simple.publishYourStatsOn(recorder);
    simple2.publishYourStatsOn(recorder);
    simple3.publishYourStatsOn(recorder);
    simple4.publishYourStatsOn(recorder);

    Map<PlainTextStatsComponents, Integer> expected =
        new HashMap<PlainTextStatsComponents, Integer>();

    int counter = 2;

    expected.put(
        PlainTextStatsComponents.NOfVertices, VertexVoteAccepter.DivideAndRound(4, counter));
    expected.put(PlainTextStatsComponents.NOfEdges, VertexVoteAccepter.DivideAndRound(6, counter));
    expected.put(
        PlainTextStatsComponents.NOfSources, VertexVoteAccepter.DivideAndRound(1, counter));
    expected.put(PlainTextStatsComponents.NOfSinks, VertexVoteAccepter.DivideAndRound(1, counter));
    expected.put(PlainTextStatsComponents.NOfWhites, VertexVoteAccepter.DivideAndRound(2, counter));

    Assert.assertTrue(recorder.average(counter).isSimpleVerticesVotesEquals(expected));
    Assert.assertFalse(
        recorder
            .average(counter)
            .isSimpleVerticesVotesEquals(new HashMap<PlainTextStatsComponents, Integer>()));
  }
  @Test
  public void check_divide_and_round_utility_method() {

    Assert.assertEquals(1, VertexVoteAccepter.DivideAndRound(4, 4));
    Assert.assertEquals(2, VertexVoteAccepter.DivideAndRound(4, 2));
    Assert.assertEquals(1, VertexVoteAccepter.DivideAndRound(1, 4));
    Assert.assertEquals(0, VertexVoteAccepter.DivideAndRound(0, 4));
    Assert.assertEquals(4, VertexVoteAccepter.DivideAndRound(16, 4));
    Assert.assertEquals(4, VertexVoteAccepter.DivideAndRound(16, 5));
  }
  @Test
  public void record_average_with_two_model_stats_information_from_connected_components() {
    VertexStatsRecorder recorder = new VertexStatsRecorder();

    ConnectedComponentWrapperVertex simple = VertexFactory.makeConnectedComponentWrapperVertex();

    ConnectedComponentWrapperVertex simple2 = VertexFactory.makeConnectedComponentWrapperVertex();

    ConnectedComponentWrapperVertex simple3 = VertexFactory.makeConnectedComponentWrapperVertex();

    ConnectedComponentWrapperVertex simple4 = VertexFactory.makeConnectedComponentWrapperVertex();

    simple.includeMember(VertexFactory.makeSimpleVertex());
    simple.includeMember(VertexFactory.makeSimpleVertex());
    simple.includeMember(VertexFactory.makeSimpleVertex());

    simple.addNeighbour(simple2);

    simple2.includeMember(VertexFactory.makeSimpleVertex());

    simple2.addNeighbour(simple3).addNeighbour(simple4);

    simple3.includeMember(VertexFactory.makeSimpleVertex());
    simple3.includeMember(VertexFactory.makeSimpleVertex());

    simple3.addNeighbour(simple4);

    simple4.includeMember(VertexFactory.makeSimpleVertex());
    simple4.includeMember(VertexFactory.makeSimpleVertex());
    simple4.includeMember(VertexFactory.makeSimpleVertex());

    simple.publishYourStatsOn(recorder);
    simple2.publishYourStatsOn(recorder);
    simple3.publishYourStatsOn(recorder);
    simple4.publishYourStatsOn(recorder);

    int counter = 1;

    Map<PlainTextStatsComponents, Integer> expectedFor3members =
        new HashMap<PlainTextStatsComponents, Integer>();

    expectedFor3members.put(
        PlainTextStatsComponents.NOfComponents, VertexVoteAccepter.DivideAndRound(2, counter));
    expectedFor3members.put(
        PlainTextStatsComponents.NOfSources, VertexVoteAccepter.DivideAndRound(1, counter));
    expectedFor3members.put(
        PlainTextStatsComponents.NOfSinks, VertexVoteAccepter.DivideAndRound(1, counter));
    expectedFor3members.put(
        PlainTextStatsComponents.NOfWhites, VertexVoteAccepter.DivideAndRound(0, counter));
    expectedFor3members.put(
        PlainTextStatsComponents.NOfEdges, VertexVoteAccepter.DivideAndRound(1, counter));

    Map<PlainTextStatsComponents, Integer> expectedFor2members =
        new HashMap<PlainTextStatsComponents, Integer>();

    expectedFor2members.put(
        PlainTextStatsComponents.NOfComponents, VertexVoteAccepter.DivideAndRound(1, counter));
    expectedFor2members.put(
        PlainTextStatsComponents.NOfSources, VertexVoteAccepter.DivideAndRound(0, counter));
    expectedFor2members.put(
        PlainTextStatsComponents.NOfSinks, VertexVoteAccepter.DivideAndRound(0, counter));
    expectedFor2members.put(
        PlainTextStatsComponents.NOfWhites, VertexVoteAccepter.DivideAndRound(1, counter));
    expectedFor2members.put(
        PlainTextStatsComponents.NOfEdges, VertexVoteAccepter.DivideAndRound(1, counter));

    Map<PlainTextStatsComponents, Integer> expectedFor1members =
        new HashMap<PlainTextStatsComponents, Integer>();

    expectedFor1members.put(
        PlainTextStatsComponents.NOfComponents, VertexVoteAccepter.DivideAndRound(1, counter));
    expectedFor1members.put(
        PlainTextStatsComponents.NOfSources, VertexVoteAccepter.DivideAndRound(0, counter));
    expectedFor1members.put(
        PlainTextStatsComponents.NOfSinks, VertexVoteAccepter.DivideAndRound(0, counter));
    expectedFor1members.put(
        PlainTextStatsComponents.NOfWhites, VertexVoteAccepter.DivideAndRound(1, counter));
    expectedFor1members.put(
        PlainTextStatsComponents.NOfEdges, VertexVoteAccepter.DivideAndRound(2, counter));

    Assert.assertTrue(recorder.average(counter).isComponentsVotesEquals(3, expectedFor3members));
    Assert.assertTrue(recorder.average(counter).isComponentsVotesEquals(2, expectedFor2members));
    Assert.assertTrue(recorder.average(counter).isComponentsVotesEquals(1, expectedFor1members));
  }