void test_message_passing_send_a_message_LedState_should_change_to_LED_ON(void){
  LedData ledData;
  ButtonData buttonData;
  
  ledInitData(&ledData);
  buttonInitData(&buttonData);
  
  ledSM(&ledData);
  TEST_ASSERT_EQUAL(ledData.state,LED_OFF);
  
  isButtonPressed_ExpectAndReturn(false);
  buttonSM(&buttonData);
  TEST_ASSERT_EQUAL(buttonData.state,RELEASE);
  
  ledSM(&ledData);
  TEST_ASSERT_EQUAL(ledData.state,LED_OFF);
  
  isButtonPressed_ExpectAndReturn(true);
  buttonSM(&buttonData);
  TEST_ASSERT_EQUAL(buttonData.state,PRESS);
  
  ledSM(&ledData);
  TEST_ASSERT_EQUAL(ledData.state,LED_BLINKING_ON);
  
  ledSM(&ledData);
  TEST_ASSERT_EQUAL(ledData.state,LED_BLINKING_OFF);
}
void test_led_with_button(void){
  ButtonData buttonData;
  LedData ledData;
  
  buttonInitData(&buttonData);
  ledInitData(&ledData);
  TEST_ASSERT_EQUAL(buttonData.state, RELEASE);
  TEST_ASSERT_EQUAL(ledData.state, LED_OFF);
  
  isButtonPressed_ExpectAndReturn(true);
  buttonSM(&buttonData);
  TEST_ASSERT_EQUAL(buttonData.state, PRESS);
  ledSM(&ledData);
  TEST_ASSERT_EQUAL(ledData.state, LED_BLINKING_ON);
  ledSM(&ledData);
  TEST_ASSERT_EQUAL(ledData.state, LED_BLINKING_OFF);
  ledSM(&ledData);
  TEST_ASSERT_EQUAL(ledData.state, LED_BLINKING_ON);
  ledSM(&ledData);
  TEST_ASSERT_EQUAL(ledData.state, LED_BLINKING_OFF);
  isButtonPressed_ExpectAndReturn(false);
  buttonSM(&buttonData);
  TEST_ASSERT_EQUAL(buttonData.state, RELEASE);
  ledSM(&ledData);
  TEST_ASSERT_EQUAL(ledData.state, LED_BLINKING_ON);
  ledSM(&ledData);
  TEST_ASSERT_EQUAL(ledData.state, LED_BLINKING_OFF);
  isButtonPressed_ExpectAndReturn(true);
  buttonSM(&buttonData);
  TEST_ASSERT_EQUAL(buttonData.state, PRESS);
  ledSM(&ledData);
  TEST_ASSERT_EQUAL(ledData.state, LED_ON);
  ledSM(&ledData);
  TEST_ASSERT_EQUAL(ledData.state, LED_ON);
  ledSM(&ledData);
  TEST_ASSERT_EQUAL(ledData.state, LED_ON);
  isButtonPressed_ExpectAndReturn(false);
  buttonSM(&buttonData);
  TEST_ASSERT_EQUAL(buttonData.state, RELEASE);
  ledSM(&ledData);
  TEST_ASSERT_EQUAL(ledData.state, LED_ON);
  ledSM(&ledData);
  TEST_ASSERT_EQUAL(ledData.state, LED_ON);
  isButtonPressed_ExpectAndReturn(true);
  buttonSM(&buttonData);
  TEST_ASSERT_EQUAL(buttonData.state, PRESS);
  ledSM(&ledData);
  TEST_ASSERT_EQUAL(ledData.state, LED_OFF);
  ledSM(&ledData);
  TEST_ASSERT_EQUAL(ledData.state, LED_OFF);
  isButtonPressed_ExpectAndReturn(false);
  buttonSM(&buttonData);
  TEST_ASSERT_EQUAL(buttonData.state, RELEASE);
  ledSM(&ledData);
  TEST_ASSERT_EQUAL(ledData.state, LED_OFF);
  ledSM(&ledData);
  TEST_ASSERT_EQUAL(ledData.state, LED_OFF);
  
  //second time
  isButtonPressed_ExpectAndReturn(true);
  buttonSM(&buttonData);
  TEST_ASSERT_EQUAL(buttonData.state, PRESS);
  ledSM(&ledData);
  TEST_ASSERT_EQUAL(ledData.state, LED_BLINKING_ON);
  ledSM(&ledData);
  TEST_ASSERT_EQUAL(ledData.state, LED_BLINKING_OFF);
  isButtonPressed_ExpectAndReturn(false);
  buttonSM(&buttonData);
  TEST_ASSERT_EQUAL(buttonData.state, RELEASE);
  ledSM(&ledData);
  TEST_ASSERT_EQUAL(ledData.state, LED_BLINKING_ON);
  isButtonPressed_ExpectAndReturn(true);
  buttonSM(&buttonData);
  TEST_ASSERT_EQUAL(buttonData.state, PRESS);
  ledSM(&ledData);
  TEST_ASSERT_EQUAL(ledData.state, LED_ON);
  isButtonPressed_ExpectAndReturn(false);
  buttonSM(&buttonData);
  TEST_ASSERT_EQUAL(buttonData.state, RELEASE);
  isButtonPressed_ExpectAndReturn(true);
  buttonSM(&buttonData);
  TEST_ASSERT_EQUAL(buttonData.state, PRESS);
  ledSM(&ledData);
  TEST_ASSERT_EQUAL(ledData.state, LED_OFF);

}