#!/usr/bin/env python3
#  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
from __future__ import absolute_import
import random
import unittest
from six.moves import range
from six.moves import zip

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()
