class SpectrumModelTest(unittest.TestCase):
    # TODO: needs to be rewritten to be more in small units etc.
    def setUp(self):
        self.x = np.linspace(0.1, 15, 100)
        self.y = np.sin(self.x)
        self.spectrum = Spectrum(self.x, self.y)
        self.spectrum_model = SpectrumModel()

    def test_set_spectrum(self):
        self.spectrum_model.set_spectrum(self.x, self.y, 'hoho')
        assert_array_almost_equal(self.spectrum_model.get_spectrum().x, self.x)
        assert_array_almost_equal(self.spectrum_model.get_spectrum().y, self.y)
        self.assertEqual(self.spectrum_model.get_spectrum().name, 'hoho')

    def test_load_spectrum(self):
        self.spectrum_model.load_spectrum(os.path.join(data_path, 'spectrum_001.xy'))
        self.assertEqual(self.spectrum_model.get_spectrum().name, 'spectrum_001')
        self.assertNotEqual(len(self.x), len(self.spectrum_model.get_spectrum().x))
        self.assertNotEqual(len(self.y), len(self.spectrum_model.get_spectrum().y))

    def test_add_overlay(self):
        x_overlay = np.linspace(0, 10)
        y_overlay = np.linspace(0, 100)
        self.spectrum_model.add_overlay(x_overlay, y_overlay, "dummy")

        self.assertEqual(len(self.spectrum_model.overlays), 1)
        new_overlay = self.spectrum_model.get_overlay(0)
        self.assertEqual(new_overlay.name, "dummy")
        assert_array_almost_equal(new_overlay.x, x_overlay)
        assert_array_almost_equal(new_overlay.y, y_overlay)

    def test_add_overlay_from_file(self):
        filename = os.path.join(data_path, 'spectrum_001.xy')
        self.spectrum_model.add_overlay_file(filename)

        self.assertEqual(len(self.spectrum_model.overlays), 1)
        self.assertEqual(self.spectrum_model.get_overlay(0).name, ''.join(os.path.basename(filename).split('.')[0:-1]))

    def test_add_spectrum_as_overlay(self):
        self.spectrum_model.add_spectrum_as_overlay()
        self.assertEqual(len(self.spectrum_model.overlays), 1)


        assert_array_almost_equal(self.spectrum_model.get_overlay(0).x, self.spectrum_model.spectrum.x)
        assert_array_almost_equal(self.spectrum_model.get_overlay(0).y, self.spectrum_model.spectrum.y)


    def test_auto_background_subtraction(self):
        x = np.linspace(0, 24, 2500)
        y = np.zeros(x.shape)

        peaks = [
            [10, 3, 0.1],
            [12, 4, 0.1],
            [12, 6, 0.1],
            ]
        for peak in peaks:
            y += gaussian(x, peak[0], peak[1], peak[2])
        y_bkg = x * 0.4 + 5.0
        y_measurement = y + y_bkg

        self.spectrum_model.set_spectrum(x, y_measurement)

        auto_background_subtraction_parameters = [2, 50, 50]
        self.spectrum_model.set_auto_background_subtraction(auto_background_subtraction_parameters)

        x_spec, y_spec = self.spectrum_model.spectrum.data

        self.assertAlmostEqual(np.sum(y_spec- y),0)