#!/usr/bin/env python
#  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
#
#  Use of this source code is governed by a BSD-style license
#  that can be found in the LICENSE file in the root of the source
#  tree. An additional intellectual property rights grant can be found
#  in the file PATENTS.  All contributing project authors may
#  be found in the AUTHORS file in the root of the source tree.

"""Run the tests with

      python misc_test.py
or
      python3 misc_test.py
"""

from __future__ import division
import random
import unittest

import misc


class TestMisc(unittest.TestCase):
  def testUnwrapMod3(self):
    data = [0, 1, 2, 0, -1, -2, -3, -4]
    unwrapped_3 = misc.Unwrap(data, 3)
    self.assertEqual([0, 1, 2, 3, 2, 1, 0, -1], unwrapped_3)

  def testUnwrapMod4(self):
    data = [0, 1, 2, 0, -1, -2, -3, -4]
    unwrapped_4 = misc.Unwrap(data, 4)
    self.assertEqual([0, 1, 2, 0, -1, -2, -3, -4], unwrapped_4)

  def testDataShouldNotChangeAfterUnwrap(self):
    data = [0, 1, 2, 0, -1, -2, -3, -4]
    _ = misc.Unwrap(data, 4)

    self.assertEqual([0, 1, 2, 0, -1, -2, -3, -4], data)

  def testRandomlyMultiplesOfModAdded(self):
    # `unwrap` definition says only multiples of mod are added.
    random_data = [random.randint(0, 9) for _ in range(100)]

    for mod in range(1, 100):
      random_data_unwrapped_mod = misc.Unwrap(random_data, mod)

      for (old_a, a) in zip(random_data, random_data_unwrapped_mod):
        self.assertEqual((old_a - a) % mod, 0)

  def testRandomlyAgainstInequalityDefinition(self):
    # Data has to satisfy -mod/2 <= difference < mod/2 for every
    # difference between consecutive values after unwrap.
    random_data = [random.randint(0, 9) for _ in range(100)]

    for mod in range(1, 100):
      random_data_unwrapped_mod = misc.Unwrap(random_data, mod)

      for (a, b) in zip(random_data_unwrapped_mod,
                        random_data_unwrapped_mod[1:]):
        self.assertTrue(-mod / 2 <= b - a < mod / 2)

  def testRandomlyDataShouldNotChangeAfterUnwrap(self):
    random_data = [random.randint(0, 9) for _ in range(100)]
    random_data_copy = random_data[:]
    for mod in range(1, 100):
      _ = misc.Unwrap(random_data, mod)

      self.assertEqual(random_data, random_data_copy)

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