// Tests the filter factor setter
TEST(HighPassFilter, TestCutoffFrequencySet) {
  
  HighPassFilter hpf;

  //Check the id's matches
  EXPECT_TRUE( hpf.getId() == HighPassFilter::getId() );

  const Float delta = 1.0 / 500.0f; //Set a delta for 500Hz

  //Set the gain with a valid value
  EXPECT_TRUE( hpf.setCutoffFrequency( 10, delta ) );
  EXPECT_EQ( hpf.getFilterFactor(), GET_FILTER_FACTOR( 10.0, delta ) );

  //Set the gain with a non valid value
  EXPECT_FALSE( hpf.setCutoffFrequency( -1, delta ) );
  EXPECT_EQ( hpf.getFilterFactor(), GET_FILTER_FACTOR( 10.0, delta ) ); //The gain should not have changed

  //Set the gain with a non valid value
  EXPECT_FALSE( hpf.setCutoffFrequency( 0, delta ) );
  EXPECT_EQ( hpf.getFilterFactor(), GET_FILTER_FACTOR( 10.0, delta ) ); //The gain should not have changed

  //Set the gain with a non valid value
  EXPECT_FALSE( hpf.setCutoffFrequency( 10, 0 ) );
  EXPECT_EQ( hpf.getFilterFactor(), GET_FILTER_FACTOR( 10.0, delta ) ); //The gain should not have changed
}
// Tests the default constructor
TEST(HighPassFilter, TestDefaultConstructor) {
  
  HighPassFilter hpf;

  //Check the id's matches
  EXPECT_TRUE( hpf.getId() == HighPassFilter::getId() );

  //Check the hpf is not trained
  EXPECT_TRUE( !hpf.getTrained() );
}
// Tests the equals operator
TEST(HighPassFilter, TestEqualsOperator) {
  
  HighPassFilter hpf;

  //Check the id's matches
  EXPECT_TRUE( hpf.getId() == HighPassFilter::getId() );

  //Check the hpf is not trained
  EXPECT_TRUE( !hpf.getTrained() );

  HighPassFilter hpf2 = hpf;

  //Check the id's matches
  EXPECT_TRUE( hpf2.getId() == HighPassFilter::getId() );

  //Check the hpf is not trained
  EXPECT_TRUE( !hpf2.getTrained() );
}
// Tests the filter factor getter/setter
TEST(HighPassFilter, TestFilterFactorGetSet) {
  
  HighPassFilter hpf;

  //Check the id's matches
  EXPECT_TRUE( hpf.getId() == HighPassFilter::getId() );

  //Set the gain with a valid value
  EXPECT_TRUE( hpf.setFilterFactor( 0.9 ) );
  EXPECT_EQ( hpf.getFilterFactor(), 0.9 );

  //Set the gain with a non valid value
  EXPECT_FALSE( hpf.setFilterFactor( -1 ) );
  EXPECT_EQ( hpf.getFilterFactor(), 0.9 ); //The gain should not have changed

  //Set the gain with a non valid value
  EXPECT_FALSE( hpf.setFilterFactor( 1.1 ) );
  EXPECT_EQ( hpf.getFilterFactor(), 0.9 ); //The gain should not have changed
}
// Tests the save/load functions
TEST(HighPassFilter, TestSaveLoad) {
  
  HighPassFilter hpf;

  //Check the id's matches
  EXPECT_TRUE( hpf.getId() == HighPassFilter::getId() );

  const Float delta = 1.0 / 500.0f; //Set a delta for 500Hz

  //Set the gain with a valid value
  EXPECT_TRUE( hpf.setCutoffFrequency( 10, delta ) );
  EXPECT_EQ( hpf.getFilterFactor(), GET_FILTER_FACTOR( 10.0, delta ) );

  EXPECT_TRUE( hpf.save("hpf_unit_test_model.grt") );

  EXPECT_TRUE( hpf.clear() );

  EXPECT_TRUE( hpf.load("hpf_unit_test_model.grt") );
  EXPECT_EQ( ROUND( hpf.getFilterFactor() ), ROUND( GET_FILTER_FACTOR( 10.0, delta ) ) ); //Due to differences in how things are load from the file, we need to round the expected value
}
int main (int argc, const char * argv[])
{
    //Create a new instance of a high pass filter, using the default constructor
    HighPassFilter hpf;
    
    //Set the cutoff frequency of the filter to 2.0Hz
    hpf.setCutoffFrequency( 2, 1.0/1000.0);
    
    //Create some varaibles to help generate the signal data
    const UINT numSeconds = 60;                         //The number of seconds of data we want to generate
    double t = 0;                                       //This keeps track of the time
    double tStep = 1.0/1000.0;                          //This is how much the time will be updated at each iteration in the for loop
    double freq = 0;                                    //Stores the frequency
    map< UINT, double > freqRates;                      //Holds the frequency rates
    map< UINT, double >::iterator iter;                 //An iterator for the frequency rates map
    
    //Add the freq rates
    //The first value is the time in seconds and the second value is the frequency that should be set at that time
    freqRates[ 0 ] = 0.1;
    freqRates[ 10 ] = 0.5;
    freqRates[ 20 ] = 1;
    freqRates[ 30 ] = 2;
    freqRates[ 40 ] = 4;
    freqRates[ 50 ] = 8;
    
    //Create and open a file to save the data
    fstream file;
    file.open("HighPassFilterData.txt", iostream::out);
    
    //Generate the signal and filter the data
    for(UINT i=0; i<numSeconds*1000; i++){
        
        //Check to see if we should update the freq rate to the next value
        iter = freqRates.find( i/1000 );
        if( iter != freqRates.end() ){
            //Set the new frequency value
            freq = iter->second;
        }
        
        //Generate the signal
        double signal = sin( t * TWO_PI*freq );
        
        //Filter the signal
        double filteredValue = hpf.filter( signal );
        
        //Write the signal and the filtered data to the file
        file << signal << "\t" << filteredValue << endl;
        
        //Update the t
        t += tStep;
    }
    
    //Close the file
    file.close();
    
    //Save the HighPassFilter settings to a file
    hpf.saveSettingsToFile("HighPassFilterSettings.txt");
    
    //We can then load the settings later if needed
    hpf.loadSettingsFromFile("HighPassFilterSettings.txt");
    
    return EXIT_SUCCESS;
}