//
//    FILE: unit_test_001.cpp
//  AUTHOR: Rob Tillaart
//    DATE: 2020-12-03
// PURPOSE: unit tests for the DHT temperature and humidity sensor
//          https://github.com/RobTillaart/DHTNew
//          https://github.com/Arduino-CI/arduino_ci/blob/master/REFERENCE.md
//

// supported assertions
// ----------------------------
// assertEqual(expected, actual)
// assertNotEqual(expected, actual)
// assertLess(expected, actual)
// assertMore(expected, actual)
// assertLessOrEqual(expected, actual)
// assertMoreOrEqual(expected, actual)
// assertTrue(actual)
// assertFalse(actual)
// assertNull(actual)

#include <ArduinoUnitTests.h>

#include "Arduino.h"
#include "dhtnew.h"


unittest_setup()
{
  fprintf(stderr, "DHTNEW_LIB_VERSION: %s\n", (char *) DHTNEW_LIB_VERSION);
}

unittest_teardown()
{
}


unittest(test_constants)
{
  assertEqual( 0, DHTLIB_OK                    );
  assertEqual(-1, DHTLIB_ERROR_CHECKSUM        );
  assertEqual(-2, DHTLIB_ERROR_TIMEOUT_A       );
  assertEqual(-3, DHTLIB_ERROR_BIT_SHIFT       );
  assertEqual(-4, DHTLIB_ERROR_SENSOR_NOT_READY);
  assertEqual(-5, DHTLIB_ERROR_TIMEOUT_C       );
  assertEqual(-6, DHTLIB_ERROR_TIMEOUT_D       );
  assertEqual(-7, DHTLIB_ERROR_TIMEOUT_B       );
  assertEqual(-8, DHTLIB_WAITING_FOR_READ      );
  
  assertEqual(-100, DHTLIB_HUMIDITY_OUT_OF_RANGE   );
  assertEqual(-101, DHTLIB_TEMPERATURE_OUT_OF_RANGE);
  
  assertEqual(-999, DHTLIB_INVALID_VALUE);
}


unittest(test_constructor)
{
  DHTNEW dht(4);

  // verify default flags
  // assertEqual(0, dht.getType());     // calls read which blocks.
  assertEqual(0, dht.getHumOffset());
  assertEqual(0, dht.getTempOffset());
  #if defined(__AVR__)
  fprintf(stderr, "__AVR__ defined.");
  assertFalse(dht.getDisableIRQ());
  #else
  fprintf(stderr, "__AVR__ not defined.");
  assertTrue(dht.getDisableIRQ());
  #endif
  assertFalse(dht.getWaitForReading());
  assertEqual(0, dht.getReadDelay());
  assertFalse(dht.getSuppressError());
}


unittest(test_hum_temp)
{
  DHTNEW dht(4);

  assertEqual(0, dht.getHumidity());
  assertEqual(0, dht.getHumOffset());
  dht.setHumOffset(1.5);
  assertEqual(1.5, dht.getHumOffset());
  
  assertEqual(0, dht.getTemperature());
  assertEqual(0, dht.getTempOffset());
  dht.setTempOffset(-1.5);
  assertEqual(-1.5, dht.getTempOffset());
}


unittest(test_process_flags)
{
  DHTNEW dht(4);

  dht.setType(11);
  assertEqual(11, dht.getType());
  dht.setType(22);
  assertEqual(22, dht.getType());
  
  dht.setDisableIRQ(true);
  assertTrue(dht.getDisableIRQ());
  dht.setDisableIRQ(false);
  assertFalse(dht.getDisableIRQ());
  
  dht.setWaitForReading(true);
  assertTrue(dht.getWaitForReading());
  dht.setWaitForReading(false);
  assertFalse(dht.getWaitForReading());
  
  dht.setReadDelay(1500);
  assertEqual(1500, dht.getReadDelay());
  dht.setType(11);
  dht.setReadDelay();
  assertEqual(0, dht.getReadDelay());
  dht.setType(22);
  dht.setReadDelay();
  assertEqual(0, dht.getReadDelay());
  
  dht.setSuppressError(true);
  assertTrue(dht.getSuppressError());
  dht.setSuppressError(false);
  assertFalse(dht.getSuppressError());
}


unittest(test_read)
{
  DHTNEW dht(4);

  fprintf(stderr, "\tread() cannot be tested  GODMODE?\n");
  // int rc = dht.read();
  // fprintf(stderr, "%d\n", rc);
  
  long lr = dht.lastRead();
  fprintf(stderr, "\ttime since lastRead %ld\n", lr);
}

unittest_main()

// --------
