# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import rf_common
import unittest

from autotest_lib.client.cros.rf.agilent_scpi import Interpolate
from autotest_lib.client.cros.rf.agilent_scpi import CheckTraceValid
from autotest_lib.client.cros.rf.lan_scpi import Error

X_VALUES = [10, 10, 15, 18, 20, 20, 30, 30, 40]
Y_VALUES = [0.5, 0.7, 0.9, 1.2, 0.6, 0.7, 0.1, 1.1, 9.1]

class TestInterpolation(unittest.TestCase):

    def testInterpolateNormal(self):
        '''Tests whether the Interpolate function works for query in range.'''
        # Test cases for non-ambiguous situation.
        self.assertAlmostEqual(0.90, Interpolate(X_VALUES, Y_VALUES, 15))
        self.assertAlmostEqual(1.10, Interpolate(X_VALUES, Y_VALUES, 17))
        self.assertAlmostEqual(9.10, Interpolate(X_VALUES, Y_VALUES, 40))

        # Test cases for duplicated values presented in X_VALUES.
        self.assertAlmostEqual(0.50, Interpolate(X_VALUES, Y_VALUES, 10))
        self.assertAlmostEqual(0.78, Interpolate(X_VALUES, Y_VALUES, 12))
        self.assertAlmostEqual(0.90, Interpolate(X_VALUES, Y_VALUES, 19))
        self.assertAlmostEqual(0.40, Interpolate(X_VALUES, Y_VALUES, 25))
        self.assertAlmostEqual(6.70, Interpolate(X_VALUES, Y_VALUES, 37))

    def testInterpolateException(self):
        '''Tests whether the Interpolate function raises exception as expected.
        '''
        # Should fail in TraceValid function.
        self.assertRaises(Error, Interpolate, [10, 50], [0.1], 44)
        # Out of range exceptions.
        self.assertRaises(Error, Interpolate, X_VALUES, Y_VALUES, 5)
        self.assertRaises(Error, Interpolate, X_VALUES, Y_VALUES, 45)


class TestTraceValid(unittest.TestCase):

    def testCheckTraceValid(self):
        # Check whether x_values is empty.
        self.assertRaises(Error, CheckTraceValid, [], [])
        # Check whether x_values and values are not equal in length.
        self.assertRaises(Error, CheckTraceValid, [10, 20], [0.5])
        # Check whether x_values is not an increasing sequence.
        self.assertRaises(Error, CheckTraceValid, [10, 20, 19], [0, 0, 0])
        # Check for valid case
        CheckTraceValid([10, 50],[0, 1])

if __name__ == '__main__':
    unittest.main()
