// -------------------------------------------------------------------------- //
//
void Test_ScalarDistributionData::testInitNotifyAccept()
{
    // Read a library.
    Library library("./testfiles/testlibSmall");

    // Construct with the normal constructor.
    const std::string scalar_name("VP-Volume");
    const std::string ref_path("./testfiles/vvol_ref.data");
    const double sigma = 0.093;
    const int pos = 1;
    ScalarDistributionData sdd(scalar_name, ref_path, sigma, pos);

    // Setup a small sampleset.
    std::vector<int> sampleset(10);
    sampleset[0] =  7;
    sampleset[1] =  9;
    sampleset[2] = 13;
    sampleset[3] = 27;
    sampleset[4] = 28;
    sampleset[5] = 29;
    sampleset[6] = 43;
    sampleset[7] = 53;
    sampleset[8] = 56;
    sampleset[9] = 57;

    // Call init.
    sdd.init(sampleset, library);

    // Check that the data was correctly set.
    CPPUNIT_ASSERT_EQUAL( 10, sdd.nsample_ );
    const double chi2 = 16.79464613935;
    CPPUNIT_ASSERT_DOUBLES_EQUAL( chi2, sdd.chi2_, 1.0e-10 );

    // Check a few values.
    CPPUNIT_ASSERT_DOUBLES_EQUAL( sdd.distribution_[1] , 0.1, 1.0e-12 );
    CPPUNIT_ASSERT_DOUBLES_EQUAL( sdd.distribution_[26], 0.2, 1.0e-12 );
    CPPUNIT_ASSERT_DOUBLES_EQUAL( sdd.distribution_[86], 0.1, 1.0e-12 );

    // Call notify.
    const int from_sample = 29;
    const int from_basis  = 34;
    sdd.notify(from_sample, from_basis, library);

    // Check chi2 and chi2_new.
    const double chi2_new = 16.7499785124567;
    CPPUNIT_ASSERT_DOUBLES_EQUAL( chi2_new, sdd.chi2_new_, 1.0e-8 );
    CPPUNIT_ASSERT_DOUBLES_EQUAL( chi2,     sdd.chi2_,     1.0e-8 );

    // Call accept.
    sdd.accept();

    // Check that chi2 was set.
    CPPUNIT_ASSERT_DOUBLES_EQUAL( chi2_new, sdd.chi2_, 1.0e-10 );

    // Check that the curve was set.
    for (size_t i = 0; i < sdd.distribution_.size(); ++i)
    {
        CPPUNIT_ASSERT_DOUBLES_EQUAL( sdd.distribution_[i], sdd.distribution_new_[i], 1.0e-12 );
    }
}
// -------------------------------------------------------------------------- //
//
void Test_ScalarDistributionData::testConstructionFail2()
{
    // Fail with empty file.
    const std::string scalar_name("VP-Area");
    const std::string ref_path("./testfiles/EMPTY_FILE");
    const double sigma = 0.093;
    const int pos = 2;
    CPPUNIT_ASSERT_THROW( ScalarDistributionData sdd(scalar_name, ref_path, sigma, pos), IOException );

}
void SplitTransactionDialog::EditEntry(int index)
{
    if (index < 0 || index >= (int)this->m_local_splits.size()) return;
    SplitDetailDialog sdd(this, m_local_splits[index], transType_, accountID_);
    if (sdd.ShowModal() == wxID_OK)
    {
        m_local_splits[index] = sdd.getResult();
        items_changed_ = true;
        DataToControls();
        UpdateSplitTotal();
    }
}
void SplitTransactionDialog::OnButtonAddClick( wxCommandEvent& /*event*/ )
{
    double amount = totalAmount_ - Model_Splittransaction::get_total(m_local_splits);
    if (amount < 0.0) amount = 0.0;
    Split split = { -1, -1, amount };
    SplitDetailDialog sdd(this, split, transType_, accountID_);
    if (sdd.ShowModal() == wxID_OK)
    {
        this->m_local_splits.push_back(sdd.getResult());
        items_changed_ = true;
    }
    DataToControls();
}
// -------------------------------------------------------------------------- //
//
void Test_ScalarDistributionData::testConstruction()
{
    // Make sure we can default construct without crashing.
    CPPUNIT_ASSERT_NO_THROW( ScalarDistributionData sdd );

    // Construct with the normal constructor.
    const std::string scalar_name("VP-Volume");
    const std::string ref_path("./testfiles/vvol_ref.data");
    const double sigma = 0.093;
    const int pos = 2;
    ScalarDistributionData sdd(scalar_name, ref_path, sigma, pos);
    // Check the member data.
    const double eps = 1.0e-12;
    CPPUNIT_ASSERT_EQUAL( sdd.name_, scalar_name );
    CPPUNIT_ASSERT_EQUAL( sdd.pos_, pos );
    CPPUNIT_ASSERT_EQUAL( sdd.nbins_, 125 );
    CPPUNIT_ASSERT_DOUBLES_EQUAL( sdd.sigma_, sigma, eps );
    CPPUNIT_ASSERT_DOUBLES_EQUAL( sdd.one_over_sigma2_, 1.0/(sigma*sigma), eps );
    CPPUNIT_ASSERT_DOUBLES_EQUAL( sdd.lowest_, 25.45, eps );
    CPPUNIT_ASSERT_DOUBLES_EQUAL( sdd.highest_, 37.85, eps );
    CPPUNIT_ASSERT_DOUBLES_EQUAL( sdd.one_over_binsize_, 10.0, eps );

    // Check dimensions.
    CPPUNIT_ASSERT_EQUAL( static_cast<int>(sdd.target_.size()), sdd.nbins_ );
    CPPUNIT_ASSERT_EQUAL( static_cast<int>(sdd.scale_.size()), sdd.nbins_ );
    CPPUNIT_ASSERT_EQUAL( static_cast<int>(sdd.factor_.size()), sdd.nbins_ );
    CPPUNIT_ASSERT_EQUAL( static_cast<int>(sdd.distribution_.size()), sdd.nbins_ );
    CPPUNIT_ASSERT_EQUAL( static_cast<int>(sdd.distribution_new_.size()), sdd.nbins_ );

    // Check hardcoded reference values.
    CPPUNIT_ASSERT_DOUBLES_EQUAL( sdd.target_[0],  0.00887034393507342, eps );
    CPPUNIT_ASSERT_DOUBLES_EQUAL( sdd.target_[8],  0.00151451299040374, eps );
    CPPUNIT_ASSERT_DOUBLES_EQUAL( sdd.target_[19], 0.00237382469428914, eps );
    CPPUNIT_ASSERT_DOUBLES_EQUAL( sdd.target_[99], 0.00178721705381046, eps );
    //
    CPPUNIT_ASSERT_DOUBLES_EQUAL( sdd.scale_[0],  25.5, eps );
    CPPUNIT_ASSERT_DOUBLES_EQUAL( sdd.scale_[8],  26.3, eps );
    CPPUNIT_ASSERT_DOUBLES_EQUAL( sdd.scale_[19], 27.4, eps );
    CPPUNIT_ASSERT_DOUBLES_EQUAL( sdd.scale_[99], 35.4, eps );

    // Check the target norm.
    CPPUNIT_ASSERT_DOUBLES_EQUAL( vsum(sdd.target_), 1.0, eps );

    // Test the edges of the binning routine in a realistic case.
    CPPUNIT_ASSERT_EQUAL(sdd.get_bin(25.0),   0);
    CPPUNIT_ASSERT_EQUAL(sdd.get_bin(31.83), 63);
    CPPUNIT_ASSERT_EQUAL(sdd.get_bin(37.87),124);
}