1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#!/usr/bin/env python
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# Copyright (c) 2013 The Chromium Authors. All rights reserved.
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# found in the LICENSE file.
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import logging
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import os
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import sys
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import unittest
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochBASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochsys.path.append(BASE_PATH)
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochfrom lib.range_dict import ExclusiveRangeDict
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ExclusiveRangeDictTest(unittest.TestCase):
187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  class TestAttribute(ExclusiveRangeDict.RangeAttribute):
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    def __init__(self):
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      super(ExclusiveRangeDictTest.TestAttribute, self).__init__()
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      self._value = 0
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    def __str__(self):
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return str(self._value)
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    def __repr__(self):
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return '<TestAttribute:%d>' % self._value
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    def get(self):
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return self._value
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    def set(self, new_value):
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      self._value = new_value
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    def copy(self):  # pylint: disable=R0201
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new_attr = ExclusiveRangeDictTest.TestAttribute()
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new_attr.set(self._value)
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return new_attr
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def test_init(self):
417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ranges = ExclusiveRangeDict(self.TestAttribute)
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    result = []
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for begin, end, attr in ranges.iter_range(20, 40):
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      result.append({'begin': begin, 'end':end, 'attr':attr.get()})
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    expected = [
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        {'begin': 20, 'end': 40, 'attr': 0},
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ]
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    self.assertEqual(expected, result)
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def test_norange(self):
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ranges = ExclusiveRangeDict(self.TestAttribute)
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    result = []
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for begin, end, attr in ranges.iter_range(20, 20):
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      result.append({'begin': begin, 'end':end, 'attr':attr.get()})
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    expected = []
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    self.assertEqual(expected, result)
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def test_set(self):
617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ranges = ExclusiveRangeDict(self.TestAttribute)
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for begin, end, attr in ranges.iter_range(20, 30):
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      attr.set(12)
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for begin, end, attr in ranges.iter_range(30, 40):
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      attr.set(52)
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    result = []
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for begin, end, attr in ranges.iter_range(20, 40):
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      result.append({'begin': begin, 'end':end, 'attr':attr.get()})
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    expected = [
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        {'begin': 20, 'end': 30, 'attr': 12},
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        {'begin': 30, 'end': 40, 'attr': 52},
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ]
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    self.assertEqual(expected, result)
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def test_split(self):
777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ranges = ExclusiveRangeDict(self.TestAttribute)
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for begin, end, attr in ranges.iter_range(20, 30):
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      attr.set(1000)
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for begin, end, attr in ranges.iter_range(30, 40):
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      attr.set(2345)
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for begin, end, attr in ranges.iter_range(40, 50):
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      attr.set(3579)
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    result1 = []
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for begin, end, attr in ranges.iter_range(25, 45):
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      result1.append({'begin': begin, 'end':end, 'attr':attr.get()})
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    expected1 = [
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        {'begin': 25, 'end': 30, 'attr': 1000},
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        {'begin': 30, 'end': 40, 'attr': 2345},
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        {'begin': 40, 'end': 45, 'attr': 3579},
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ]
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    self.assertEqual(expected1, result1)
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    result2 = []
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for begin, end, attr in ranges.iter_range(20, 50):
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      result2.append({'begin': begin, 'end':end, 'attr':attr.get()})
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    expected2 = [
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        {'begin': 20, 'end': 25, 'attr': 1000},
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        {'begin': 25, 'end': 30, 'attr': 1000},
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        {'begin': 30, 'end': 40, 'attr': 2345},
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        {'begin': 40, 'end': 45, 'attr': 3579},
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        {'begin': 45, 'end': 50, 'attr': 3579},
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ]
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    self.assertEqual(expected2, result2)
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def test_fill(self):
1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ranges = ExclusiveRangeDict(self.TestAttribute)
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for begin, end, attr in ranges.iter_range(30, 35):
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      attr.set(12345)
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for begin, end, attr in ranges.iter_range(40, 45):
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      attr.set(97531)
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    result = []
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for begin, end, attr in ranges.iter_range(25, 50):
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      result.append({'begin': begin, 'end':end, 'attr':attr.get()})
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    expected = [
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        {'begin': 25, 'end': 30, 'attr': 0},
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        {'begin': 30, 'end': 35, 'attr': 12345},
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        {'begin': 35, 'end': 40, 'attr': 0},
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        {'begin': 40, 'end': 45, 'attr': 97531},
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        {'begin': 45, 'end': 50, 'attr': 0},
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ]
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    self.assertEqual(expected, result)
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)if __name__ == '__main__':
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  logging.basicConfig(
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      level=logging.DEBUG if '-v' in sys.argv else logging.ERROR,
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      format='%(levelname)5s %(filename)15s(%(lineno)3d): %(message)s')
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  unittest.main()
132