void test_led_on_do_nothing(void){
  LedData ledData;
  
  ledInitData(&ledData);
  msg = CHANGE_MODE;
  ledSM(&ledData);
  
  TEST_ASSERT_EQUAL(ledData.state, LED_BLINKING_ON);
  
  msg = DO_NOTHING;
  ledSM(&ledData);
  
  TEST_ASSERT_EQUAL(ledData.state, LED_BLINKING_OFF);
  
  msg = CHANGE_MODE;
  ledSM(&ledData);
  
  TEST_ASSERT_EQUAL(ledData.state, LED_ON);
  
  msg = DO_NOTHING;
  ledSM(&ledData);
  
  TEST_ASSERT_EQUAL(ledData.state, LED_ON);
  
  msg = DO_NOTHING;
  ledSM(&ledData);
  
  TEST_ASSERT_EQUAL(ledData.state, LED_ON);
  
}
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_at_blinking_on_change_mode(void){
  LedData ledData;
  
  ledInitData(&ledData);
  msg = CHANGE_MODE;
  ledSM(&ledData);
  
  TEST_ASSERT_EQUAL(ledData.state, LED_BLINKING_ON);
  
  msg = CHANGE_MODE;
  ledSM(&ledData);
  
  TEST_ASSERT_EQUAL(ledData.state, LED_ON);
  
}
void test_LedSM_should_change_state_to_LED_BLINKING_ON_when_receive_message_CHANGE_MODE___INITIAL_LED_OFF()
{
	LedData ledData ; 
	ledInitData(&ledData);

	msg = DO_NOTHING ;
	
	turnOffLED_Expect(LED3);
	ledSM(&ledData);
	TEST_ASSERT_EQUAL(ledData.state,LED_OFF);

 	msg = CHANGE_MODE;
	
	turnOffLED_Expect(LED3);
	ledSM(&ledData);
	TEST_ASSERT_EQUAL(ledData.state,LED_BLINKING_ON); 
}
void test_led_do_nothing(void){
  LedData ledData;
  
  ledInitData(&ledData);
  msg = DO_NOTHING;
  ledSM(&ledData);
  
  TEST_ASSERT_EQUAL(ledData.state, LED_OFF);
}
void test_LedSM_should_change_state_to_LED_BLINKING_ON_and_reset_timer_when_timer_expires___INITIAL_LED_BLINKING_OFF()
{
	LedData ledData ; 
	ledData.state = LED_BLINKING_OFF ;
	
	msg = DO_NOTHING ;
	
	turnOffLED_Expect(LED3);
	checkTime_ExpectAndReturn(500,LED3,0);
	ledSM(&ledData);
	TEST_ASSERT_EQUAL(ledData.state,LED_BLINKING_OFF);
	
	turnOffLED_Expect(LED3);
	checkTime_ExpectAndReturn(500,LED3,1);
	ledSM(&ledData);
	TEST_ASSERT_EQUAL(ledData.state,LED_BLINKING_ON);
	
}
void test_LEDSM_should_change_state_to_LED_OFF_when_receive_message_CHANGE_MODE__INITIAL_LED_ON()
{
	LedData ledData ; 
	ledData.state = LED_ON ;
	
	msg = CHANGE_MODE;
	turnOnLED_Expect(LED3);
	ledSM(&ledData);
	TEST_ASSERT_EQUAL(ledData.state,LED_OFF);
}
void test_ledSM_given_LED_OFF_state_should_remain_LED_OFF_state_if_msg_is_DO_NOTHING(void)
{
	LedData ledData;

    ledInitData(&ledData);
    TEST_ASSERT_EQUAL(ledData.state, LED_OFF);

    msg = DO_NOTHING;
    turnOffLED_Expect(PORTG, LED3);
    ledSM(&ledData);
    TEST_ASSERT_EQUAL(ledData.state, LED_OFF);
}
void test_message_passing_for_intergrated_test(void)
{
	LedData ledData;
	ButtonData buttonData;

    ledInitData(&ledData);
    buttonInitData(&buttonData);

    //off to blink
    readUserButton_ExpectAndReturn(1);
    buttonSM(&buttonData);
    turnOffLED_Expect(PORTG, LED3);
    ledSM(&ledData);

    TEST_ASSERT_EQUAL(buttonData.state, PRESS);
    TEST_ASSERT_EQUAL(ledData.state, LED_BLINKING_ON);

    //blinking on to blinking off
    readUserButton_ExpectAndReturn(0);
    buttonSM(&buttonData);
    turnOnLED_Expect(PORTG, LED3);
    isTimerExpire_ExpectAndReturn(FIVE_HUND_MILISEC, &ledData.time, 1);
    ledSM(&ledData);

    TEST_ASSERT_EQUAL(buttonData.state, RELEASE);
    TEST_ASSERT_EQUAL(ledData.state, LED_BLINKING_OFF);
    
    //blinking off to blinking on
    readUserButton_ExpectAndReturn(0);
    buttonSM(&buttonData);
    turnOffLED_Expect(PORTG, LED3);
    isTimerExpire_ExpectAndReturn(FIVE_HUND_MILISEC, &ledData.time, 1);
    ledSM(&ledData);

    TEST_ASSERT_EQUAL(buttonData.state, RELEASE);
    TEST_ASSERT_EQUAL(ledData.state, LED_BLINKING_ON);
    
    //blinking off to on
    ledData.state = LED_BLINKING_OFF;
    readUserButton_ExpectAndReturn(1);
    buttonSM(&buttonData);
    turnOffLED_Expect(PORTG, LED3);
    ledSM(&ledData);

    TEST_ASSERT_EQUAL(buttonData.state, PRESS);
    TEST_ASSERT_EQUAL(ledData.state, LED_ON);
    
    //on to off
    readUserButton_ExpectAndReturn(0);
    buttonSM(&buttonData);
    turnOnLED_Expect(PORTG, LED3);
    ledSM(&ledData);
    readUserButton_ExpectAndReturn(1);
    buttonSM(&buttonData);
    turnOnLED_Expect(PORTG, LED3);
    ledSM(&ledData);

    TEST_ASSERT_EQUAL(buttonData.state, PRESS);
    TEST_ASSERT_EQUAL(ledData.state, LED_OFF);
}
void test_ledSM_given_LED_BLINKING_ON_state_should_change_to_LED_ON_state_if_msg_is_CHANGE_MODE(void)
{
	LedData ledData;

    ledData.state = LED_BLINKING_ON;
    msg = CHANGE_MODE;

    turnOnLED_Expect(PORTG, LED3);

    ledSM(&ledData);
    TEST_ASSERT_EQUAL(ledData.state, LED_ON);
    TEST_ASSERT_EQUAL(msg, DO_NOTHING);
}
void test_ledSM_given_LED_ON_state_should_remain_LED_ON_state_if_msg_is_DO_NOTHING(void)
{
	LedData ledData;

    ledData.state = LED_ON;
    msg = DO_NOTHING;

    turnOnLED_Expect(PORTG, LED3);

    ledSM(&ledData);
    TEST_ASSERT_EQUAL(ledData.state, LED_ON);
    TEST_ASSERT_EQUAL(msg, DO_NOTHING);
}
void test_ledSM_given_LED_BLINKING_ON_state_should_remain_LED_BLINKING_ON_state_if_msg_is_DO_NOTHING(void)
{
	LedData ledData;

    ledData.state = LED_BLINKING_ON;
    ledData.time = 0;
    msg = DO_NOTHING;

    turnOnLED_Expect(PORTG, LED3);
    isTimerExpire_ExpectAndReturn(FIVE_HUND_MILISEC, &ledData.time, 0);

    ledSM(&ledData);
    TEST_ASSERT_EQUAL(ledData.state, LED_BLINKING_ON);
    TEST_ASSERT_EQUAL(msg, DO_NOTHING);
}
void test_ledSM_given_LED_BLINKING_OFF_state_should_change_to_LED_BLINKING_ON_state_if_timer_expired(void)
{
	LedData ledData;

    ledData.state = LED_BLINKING_OFF;
    ledData.time = 0;
    msg = DO_NOTHING;

    turnOffLED_Expect(PORTG, LED3);
    isTimerExpire_ExpectAndReturn(FIVE_HUND_MILISEC, &ledData.time, 1);

    ledSM(&ledData);
    TEST_ASSERT_EQUAL(ledData.state, LED_BLINKING_ON);
    TEST_ASSERT_EQUAL(msg, DO_NOTHING);
}
void test_message_passing_given_DO_NOTHING_and_LED_ON_ledState_should_remain_LED_ON(void)
{
	LedData ledData;
	ButtonData buttonData;

    ledData.state = LED_ON;
    buttonInitData(&buttonData);

    readUserButton_ExpectAndReturn(0);

    buttonSM(&buttonData);

    turnOnLED_Expect(PORTG, LED3);

    ledSM(&ledData);

    TEST_ASSERT_EQUAL(buttonData.state, RELEASE);
    TEST_ASSERT_EQUAL(ledData.state, LED_ON);
}
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);

}