/*
 * Check that SetDMX/GetDMX works
 */
void UniverseTest::testSetGetDmx() {
  Universe *universe = m_store->GetUniverseOrCreate(TEST_UNIVERSE);
  OLA_ASSERT(universe);

  // a new universe should be all 0s
  DmxBuffer empty_buffer;
  OLA_ASSERT(empty_buffer == universe->GetDMX());

  // check that SetDMX works
  OLA_ASSERT(universe->SetDMX(m_buffer));
  OLA_ASSERT(m_buffer == universe->GetDMX());
}
/*
 * Check that SendDmx updates all ports
 */
void UniverseTest::testSendDmx() {
  Universe *universe = m_store->GetUniverseOrCreate(TEST_UNIVERSE);
  OLA_ASSERT(universe);

  TestMockOutputPort port(NULL, 1);  // output port
  universe->AddPort(&port);
  OLA_ASSERT_EQ((unsigned int) 0, universe->InputPortCount());
  OLA_ASSERT_EQ((unsigned int) 1, universe->OutputPortCount());
  OLA_ASSERT(universe->IsActive());

  // send some data to the universe and check the port gets it
  OLA_ASSERT(universe->SetDMX(m_buffer));
  OLA_ASSERT(m_buffer == port.ReadDMX());

  // remove the port from the universe
  universe->RemovePort(&port);
  OLA_ASSERT_EQ((unsigned int) 0, universe->InputPortCount());
  OLA_ASSERT_EQ((unsigned int) 0, universe->OutputPortCount());
  OLA_ASSERT_FALSE(universe->IsActive());
}
/*
 * Check that the GetDmx method works
 */
void OlaServerServiceImplTest::testGetDmx() {
  UniverseStore store(NULL, NULL);
  OlaServerServiceImpl impl(&store,
                            NULL,
                            NULL,
                            NULL,
                            NULL,
                            NULL,
                            NULL,
                            m_uid);
  OlaClientService service(NULL, &impl);

  GenericMissingUniverseCheck<GetDmxCheck, ola::proto::DmxData>
    missing_universe_check;
  GetDmxNoDataCheck empty_data_check;
  GetDmxValidDataCheck valid_data_check;

  // test a universe that doesn't exist
  unsigned int universe_id = 0;
  CallGetDmx(&impl, universe_id, missing_universe_check);

  // test a new universe
  Universe *universe = store.GetUniverseOrCreate(universe_id);
  OLA_ASSERT(universe);
  CallGetDmx(&impl, universe_id, empty_data_check);

  // Set the universe data
  DmxBuffer buffer(SAMPLE_DMX_DATA, sizeof(SAMPLE_DMX_DATA));
  universe->SetDMX(buffer);
  CallGetDmx(&impl, universe_id, valid_data_check);

  // remove the universe and try again
  store.AddUniverseGarbageCollection(universe);
  store.GarbageCollectUniverses();
  CallGetDmx(&impl, universe_id, missing_universe_check);
}
/*
 * Check that we can add/remove sink clients from this universes
 */
void UniverseTest::testSinkClients() {
  Universe *universe = m_store->GetUniverseOrCreate(TEST_UNIVERSE);
  OLA_ASSERT(universe);
  OLA_ASSERT_EQ((unsigned int) 0, universe->SourceClientCount());
  OLA_ASSERT_EQ((unsigned int) 0, universe->SinkClientCount());

  // test that we can add a source client
  MockClient client;
  universe->AddSinkClient(&client);
  OLA_ASSERT_EQ((unsigned int) 1, universe->SinkClientCount());
  OLA_ASSERT_EQ((unsigned int) 0, universe->SourceClientCount());
  OLA_ASSERT(universe->ContainsSinkClient(&client));
  OLA_ASSERT_FALSE(universe->ContainsSourceClient(&client));
  OLA_ASSERT(universe->IsActive());

  // Setting DMX now should update the client
  OLA_ASSERT_FALSE(client.m_dmx_set);
  universe->SetDMX(m_buffer);
  OLA_ASSERT(client.m_dmx_set);

  // now remove it
  universe->RemoveSinkClient(&client);
  OLA_ASSERT_EQ((unsigned int) 0, universe->SinkClientCount());
  OLA_ASSERT_EQ((unsigned int) 0, universe->SourceClientCount());
  OLA_ASSERT_FALSE(universe->ContainsSinkClient(&client));
  OLA_ASSERT_FALSE(universe->ContainsSourceClient(&client));
  OLA_ASSERT_FALSE(universe->IsActive());

  // try to remove it again
  OLA_ASSERT_FALSE(universe->RemoveSinkClient(&client));
  OLA_ASSERT_EQ((unsigned int) 0, universe->SinkClientCount());
  OLA_ASSERT_EQ((unsigned int) 0, universe->SourceClientCount());
  OLA_ASSERT_FALSE(universe->ContainsSinkClient(&client));
  OLA_ASSERT_FALSE(universe->ContainsSourceClient(&client));
  OLA_ASSERT_FALSE(universe->IsActive());
}