class MyTestCase(unittest.TestCase):
    def setUp(self) -> None:
        self.calculator = Calculator()

    def test_zscore(self):
        test_data = CsvReader('/Tests/Data/unit_test_zscore.csv').data
        for row in test_data:
            self.assertEqual(self.calculator.zscore(row['Value 1'],row['Value 2'],row['Value 3']), Decimal(row['Result']).quantize(Decimal('.001')))
            self.assertEqual(self.calculator.result, Decimal(row['Result']).quantize(Decimal('.001')))

    def test_standardized_score(self):
        test_data = CsvReader('/Tests/Data/unit_test_standardized_score.csv').data
        for row in test_data:
            self.assertEqual(self.calculator.standardized_score(row['Value 1'],row['Value 2'],row['Value 3']), Decimal(row['Result']).quantize(Decimal('.001')))
            self.assertEqual(self.calculator.result, Decimal(row['Result']).quantize(Decimal('.001')))
 
    def test_population_correlation_coefficient(self):
        test_data = CsvReader('/Tests/Data/unit_test_population_correlation_coefficient.csv').data
        for row in test_data:
            self.assertEqual(self.calculator.population_correlation_coefficient(row['Value 1'],row['Value 2'],row['Value 3']), Decimal(row['Result']).quantize(Decimal('.001')))
            self.assertEqual(self.calculator.result, Decimal(row['Result']).quantize(Decimal('.001')))

    def test_confidence_interval(self):
        test_data = CsvReader('/Tests/Data/unit_test_confidence_interval.csv').data
        for row in test_data:
            self.assertEqual(
                self.calculator.confidence_interval(row['Value 1'], row['Value 2'], row['Value 3']),
                Decimal(row['Result']).quantize(Decimal('.001')))
            self.assertEqual(self.calculator.result, Decimal(row['Result']).quantize(Decimal('.001')))
class MyTestCase(unittest.TestCase):
    def setUp(self) -> None:
        self.calculator = Calculator()

    def test_mean(self):
        test_data = CsvReader('./Tests/Data/unit_test_mean.csv').data
        for row in test_data:
            nums = [float(val) for val in row['nums'].split('_')]
            result = float(row['result'])
            self.assertAlmostEqual(self.calculator.population_mean(nums),
                                   result)
            self.assertAlmostEqual(self.calculator.result, result)
            self.assertNotEqual(self.calculator.population_mean(nums),
                                result - 1)
            self.assertNotEqual(self.calculator.result, result - 1)

    def test_median(self):
        test_data = CsvReader('./Tests/Data/unit_test_median.csv').data
        for row in test_data:
            nums = [float(val) for val in row['nums'].split('_')]
            result = float(row['result'])
            self.assertAlmostEqual(self.calculator.median(nums), result)
            self.assertAlmostEqual(self.calculator.result, result)
            self.assertNotEqual(self.calculator.median(nums), result - 1)
            self.assertNotEqual(self.calculator.result, result - 1)

    def test_mode(self):
        test_data = CsvReader('./Tests/Data/unit_test_mode.csv').data
        for row in test_data:
            nums = [float(val) for val in row['nums'].split('_')]
            result = [
                float(val) for val in row['result'].split('_') if val != ''
            ]
            self.assertAlmostEqual(self.calculator.mode(nums), result)
            self.assertAlmostEqual(self.calculator.result, result)
            if len(
                    result
            ) != 0:  #add some other number so we can check if the mode is not equal
                result.append(result[0])
            else:
                result.append(0)
            self.assertNotEqual(self.calculator.mode(nums), result)
            self.assertNotEqual(self.calculator.result, result)

    def test_sample_standard_deviation(self):
        test_data = CsvReader(
            './Tests/Data/unit_test_sample_standard_deviation.csv').data
        for row in test_data:
            nums = [float(val) for val in row['nums'].split('_')]
            result = float(row['result'])
            self.assertAlmostEqual(
                self.calculator.sample_standard_deviation(nums), result)
            self.assertAlmostEqual(self.calculator.result, result)
            self.assertNotEqual(
                self.calculator.sample_standard_deviation(nums), result - 1)
            self.assertNotEqual(self.calculator.result, result - 1)

    def test_population_standard_deviation(self):
        test_data = CsvReader(
            './Tests/Data/unit_test_population_standard_deviation.csv').data
        for row in test_data:
            nums = [float(val) for val in row['nums'].split('_')]
            result = float(row['result'])
            self.assertAlmostEqual(self.calculator.population_stdev(nums),
                                   result)
            self.assertAlmostEqual(self.calculator.result, result)
            self.assertNotEqual(self.calculator.population_stdev(nums),
                                result - 1)
            self.assertNotEqual(self.calculator.result, result - 1)

    def test_population_variance(self):
        test_data = CsvReader(
            './Tests/Data/unit_test_population_variance.csv').data
        for row in test_data:
            nums = [float(val) for val in row['nums'].split('_')]
            result = float(row['result'])
            self.assertAlmostEqual(self.calculator.population_variance(nums),
                                   result)
            self.assertAlmostEqual(self.calculator.result, result)
            self.assertNotEqual(self.calculator.population_variance(nums),
                                result - 1)
            self.assertNotEqual(self.calculator.result, result - 1)

    def test_zscore(self):
        test_data = CsvReader('./Tests/Data/unit_test_zscore.csv').data
        for row in test_data:
            nums = [float(val) for val in row['nums'].split('_')]
            sample = float(row['sample'])
            result = float(row['result'])
            self.assertAlmostEqual(self.calculator.zscore(nums, sample),
                                   result)
            self.assertAlmostEqual(self.calculator.result, result)
            self.assertNotEqual(self.calculator.zscore(nums, sample),
                                result - 1)
            self.assertNotEqual(self.calculator.result, result - 1)

    def test_standardized_score(self):
        test_data = CsvReader(
            './Tests/Data/unit_test_standardized_score.csv').data
        for row in test_data:
            nums = [float(val) for val in row['nums'].split('_')]
            sample = float(row['sample'])
            result = float(row['result'])
            self.assertAlmostEqual(self.calculator.zscore(nums, sample),
                                   result)
            self.assertAlmostEqual(self.calculator.result, result)
            self.assertNotEqual(self.calculator.zscore(nums, sample),
                                result - 1)
            self.assertNotEqual(self.calculator.result, result - 1)

    def test_population_correlation_coefficient(self):
        test_data = CsvReader(
            './Tests/Data/unit_test_population_correlation_coefficient.csv'
        ).data
        for row in test_data:
            numsx = [float(val) for val in row['numsx'].split('_')]
            numsy = [float(val) for val in row['numsy'].split('_')]
            result = float(row['result'])
            self.assertAlmostEqual(
                self.calculator.population_correlation_coefficient(
                    numsx, numsy), result)
            self.assertAlmostEqual(self.calculator.result, result)
            self.assertNotEqual(
                self.calculator.population_correlation_coefficient(
                    numsx, numsy), result - 1)
            self.assertNotEqual(self.calculator.result, result - 1)

    def test_confidence_interval(self):
        test_data = CsvReader(
            './Tests/Data/unit_test_confidence_interval.csv').data
        for row in test_data:
            nums = [float(val) for val in row['nums'].split('_')]
            sampleMean = float(row['sampleMean'])
            result = [float(val) for val in row['result'].split('_')]
            val = self.calculator.confidence_interval(nums, sampleMean)
            self.assertAlmostEqual(val[0], result[0])
            self.assertAlmostEqual(val[1], result[1])
            self.assertNotEqual(val[0], result[0] - 1)
            self.assertNotEqual(val[1], result[1] - 1)

    def test_p_value(self):
        test_data = CsvReader('./Tests/Data/unit_test_p_value.csv').data
        for row in test_data:
            nums = [float(val) for val in row['nums'].split('_')]
            hypothesisMean = float(row['hypothesisMean'])
            populationStdev = float(row['populationStdev'])
            result = float(row['result'])
            self.assertAlmostEqual(
                self.calculator.p_value(nums, hypothesisMean, populationStdev),
                result)
            self.assertAlmostEqual(self.calculator.result, result)
            self.assertNotEqual(
                self.calculator.p_value(nums, hypothesisMean, populationStdev),
                result - 1)
            self.assertNotEqual(self.calculator.result, result - 1)

    def test_proportion(self):
        test_data = CsvReader('./Tests/Data/unit_test_proportion.csv').data
        for row in test_data:
            a = float(row['a'])
            b = float(row['b'])
            result = float(row['result'])
            self.assertAlmostEqual(self.calculator.proportion(a, b), result)
            self.assertAlmostEqual(self.calculator.result, result)
            self.assertNotEqual(self.calculator.proportion(a, b), result - 1)
            self.assertNotEqual(self.calculator.result, result - 1)

    def test_sample_mean(self):
        test_data = CsvReader('./Tests/Data/unit_test_sample_mean.csv').data
        for row in test_data:
            nums = [float(val) for val in row['nums'].split('_')]
            result = float(row['result'])
            self.assertAlmostEqual(self.calculator.population_mean(nums),
                                   result)
            self.assertAlmostEqual(self.calculator.result, result)
            self.assertNotEqual(self.calculator.population_mean(nums),
                                result - 1)
            self.assertNotEqual(self.calculator.result, result - 1)

    def test_variance_of_sample_proportion(self):
        test_data = CsvReader(
            './Tests/Data/unit_test_variance_of_sample_proportion.csv').data
        for row in test_data:
            nums = [float(val) for val in row['nums'].split('_')]
            result = float(row['result'])
            self.assertAlmostEqual(
                self.calculator.variance_of_sample_proportion(nums), result)
            self.assertAlmostEqual(self.calculator.result, result)
            self.assertNotEqual(
                self.calculator.variance_of_sample_proportion(nums),
                result - 1)
            self.assertNotEqual(self.calculator.result, result - 1)

    def test_variance_of_population_proportion(self):
        test_data = CsvReader(
            './Tests/Data/unit_test_variance_of_population_proportion.csv'
        ).data
        for row in test_data:
            nums = [float(val) for val in row['nums'].split('_')]
            result = float(row['result'])
            self.assertAlmostEqual(
                self.calculator.variance_of_population_proportion(nums),
                result)
            self.assertAlmostEqual(self.calculator.result, result)
            self.assertNotEqual(
                self.calculator.variance_of_population_proportion(nums),
                result - 1)
            self.assertNotEqual(self.calculator.result, result - 1)