def test_ranges_by_all():
    rd1 = RangeDictionary(10, defaults)
    view = rd1[1, 2, 4, 5, 6, 7]
    view["a"] = "foo"
    assert [(0, 1, {
        "a": "alpha",
        "b": "bravo"
    }), (1, 3, {
        "a": "foo",
        "b": "bravo"
    }), (3, 4, {
        "a": "alpha",
        "b": "bravo"
    }), (4, 8, {
        "a": "foo",
        "b": "bravo"
    }), (8, 10, {
        "a": "alpha",
        "b": "bravo"
    })] == rd1.get_ranges()
    assert [(1, 3, {
        "a": "foo",
        "b": "bravo"
    }), (4, 8, {
        "a": "foo",
        "b": "bravo"
    })] == view.get_ranges()
    rd1[5]["a"] = "bar"
    assert [(1, 3, {"a": "foo", "b": "bravo"}),
            (4, 5, {"a": "foo", "b": "bravo"}),
            (5, 6, {"a": "bar", "b": "bravo"}),
            (6, 8, {"a": "foo", "b": "bravo"})] \
        == view.get_ranges()
def test_copy():
    rd = RangeDictionary(3)
    a_list1 = RangedList(3, [1, 2, 3])
    a_list2 = RangedList(3, 5)
    a_calc1 = a_list1 * 4
    a_calc2 = a_list2 * 4
    rd["list1"] = a_list1
    rd["list2"] = a_list2
    rd["calc1"] = a_calc1
    rd["calc2"] = a_calc2
    rd2 = rd.copy()
    a_list1_copy = rd2["list1"]
    assert a_list1_copy == [1, 2, 3]
    assert list(a_list1_copy.iter_ranges()) == \
           [(0, 1, 1), (1, 2, 2), (2, 3, 3)]
    a_list2_copy = rd2["list2"]
    assert list(a_list2_copy.iter_ranges()) == [(0, 3, 5)]
    assert a_list2_copy == [5, 5, 5]
    calc1_copy = rd2["calc1"]
    assert calc1_copy == [4, 8, 12]
    assert list(calc1_copy.iter_ranges()) == \
           [(0, 1, 4), (1, 2, 8), (2, 3, 12)]
    calc2_copy = rd2["calc2"]
    assert calc2_copy == [20, 20, 20]
    assert list(calc2_copy.iter_ranges()) == [(0, 3, 20)]
def test_ranges_by_key():
    rd1 = RangeDictionary(10, defaults)
    single1 = rd1[4]
    assert [(4, 5, "alpha")] == list(single1.iter_ranges(key="a"))
    single1["a"] = "foo"
    assert [(0, 4, "alpha"), (4, 5, "foo"), (5, 10, "alpha")] == \
        rd1.get_ranges(key="a")
    assert [(4, 5, "foo")] == list(single1.iter_ranges(key="a"))
def test_ranges_by_key():
    rd1 = RangeDictionary(10, defaults)
    view = rd1[1, 2, 4, 5, 6, 7]
    view["a"] = "foo"
    assert [(0, 1, "alpha"), (1, 3, "foo"), (3, 4, "alpha"), (4, 8, "foo"),
            (8, 10, "alpha")] == list(rd1.iter_ranges(key="a"))
    assert [(1, 3, "foo"), (4, 8, "foo")] == list(view.iter_ranges(key="a"))
    rd1[5]["a"] = "bar"
    assert [(1, 3, "foo"), (4, 5, "foo"), (5, 6, "bar"), (6, 8, "foo")] \
        == list(view.iter_ranges(key="a"))
def test_ranges_by_key():
    rd1 = RangeDictionary(10, defaults)
    slice_view1 = rd1[4:7]
    assert [(4, 7, "alpha")] == list(slice_view1.iter_ranges(key="a"))
    slice_view1["a"] = "foo"
    assert [(0, 4, "alpha"), (4, 7, "foo"), (7, 10, "alpha")] \
        == rd1.get_ranges(key="a")
    assert [(4, 7, "foo")] == list(slice_view1.iter_ranges(key="a"))
    rd1[5]["a"] = "bar"
    assert [(4, 5, "foo"), (5, 6, "bar"), (6, 7, "foo")] \
        == list(slice_view1.iter_ranges(key="a"))
def test_empty():
    rd1 = RangeDictionary(10)
    rl = RangedList(10, "gamma")
    rd1["g"] = rl
    rd1["a"] = "alpha"
    rd1["b"] = [
        "bravo", "bravo", "bravo", "bravo", "bravo", "bravo", "bravo", "bravo",
        "bravo", "bravo"
    ]
    new_dict = {"a": "alpha", "b": "bravo", "g": "gamma"}
    assert new_dict == rd1.get_value()
def test_iter_by_slice():
    rd1 = RangeDictionary(10)
    rd1["g"] = "gamma"
    rd1["a"] = "alpha"
    rd1["b"] = [
        "bravo0", "bravo1", "bravo2", "bravo3", "bravo4", "bravo5", "bravo6",
        "bravo7", "bravo8+", "bravo9"
    ]

    slice_view1 = rd1[2:4]
    iterator = slice_view1.iter_all_values()
    assert {"a": "alpha", "b": "bravo2", "g": "gamma"} == next(iterator)
    assert {"a": "alpha", "b": "bravo3", "g": "gamma"} == next(iterator)
    with pytest.raises(StopIteration):
        next(iterator)

    iterator = slice_view1.iter_all_values(update_save=True)
    assert {"a": "alpha", "b": "bravo2", "g": "gamma"} == next(iterator)
    rd1["b"][3] = "new3"
    assert {"a": "alpha", "b": "new3", "g": "gamma"} == next(iterator)
    with pytest.raises(StopIteration):
        next(iterator)
    rd1["b"][3] = "bravo3"

    iterator = slice_view1.iter_all_values(key="b")
    assert "bravo2" == next(iterator)
    assert "bravo3" == next(iterator)
    with pytest.raises(StopIteration):
        next(iterator)

    iterator = slice_view1.iter_all_values(update_save=True, key="b")
    assert "bravo2" == next(iterator)
    rd1["b"][3] = "new3"
    assert "new3" == next(iterator)
    with pytest.raises(StopIteration):
        next(iterator)
    rd1["b"][3] = "bravo3"

    iterator = rd1.iter_values_by_slice(2, 4, key=["b", "a"])
    assert {"a": "alpha", "b": "bravo2"} == next(iterator)
    assert {"a": "alpha", "b": "bravo3"} == next(iterator)
    with pytest.raises(StopIteration):
        next(iterator)

    iterator = rd1.iter_values_by_slice(2, 4, key=["b", "a"], update_save=True)
    assert {"a": "alpha", "b": "bravo2"} == next(iterator)
    rd1["b"][3] = "new3"
    assert {"a": "alpha", "b": "new3"} == next(iterator)
    with pytest.raises(StopIteration):
        next(iterator)
    rd1["b"][3] = "bravo3"
def test_ranges_all():
    rd1 = RangeDictionary(10, defaults)
    assert [(0, 10, {"a": "alpha", "b": "bravo"})] == rd1.get_ranges()
    rd1[4]["a"] = "foo"
    assert [(0, 4, {
        "a": "alpha",
        "b": "bravo"
    }), (4, 5, {
        "a": "foo",
        "b": "bravo"
    }), (5, 10, {
        "a": "alpha",
        "b": "bravo"
    })] == rd1.get_ranges()
def test_iter_values():
    rd1 = RangeDictionary(10, defaults)
    single1 = rd1[4]
    aware = rd1.iter_all_values(key="a", update_save=True)
    fast = rd1.iter_all_values(key="a", update_save=False)
    assert [
        "alpha", "alpha", "alpha", "alpha", "alpha", "alpha", "alpha", "alpha",
        "alpha", "alpha"
    ] == list(fast)
    single1["a"] = "Foo"
    assert [
        "alpha", "alpha", "alpha", "alpha", "Foo", "alpha", "alpha", "alpha",
        "alpha", "alpha"
    ] == list(aware)
def test_iter_tests():
    rd1 = RangeDictionary(10)
    rl = RangedList(10, "gamma")
    rd1["g"] = rl
    rd1["a"] = "alpha"
    rd1["b"] = [
        "bravo", "bravo", "bravo", "bravo", "bravo", "bravo", "bravo", "bravo",
        "bravo", "bravo"
    ]
    result = set(rd1.iteritems())
    check = {('a', 'alpha'), ('b', 'bravo'), ('g', 'gamma')}
    assert check == result
    result = set(rd1.itervalues())
    check = {'alpha', 'bravo', 'gamma'}
    assert check == result
def test_reset():
    rd1 = RangeDictionary(10)
    rl = RangedList(10, "gamma")
    rd1["g"] = rl
    rd1["a"] = "alpha"
    rd1["b"] = [
        "bravo", "bravo", "bravo", "bravo", "bravo", "bravo", "bravo", "bravo",
        "bravo", "bravo"
    ]
    rd1["a"] = "beta"
    rd1.reset("a")
    assert rd1["a"] == [
        "alpha", "alpha", "alpha", "alpha", "alpha", "alpha", "alpha", "alpha",
        "alpha", "alpha"
    ]
def test_ranges_all():
    rd1 = RangeDictionary(10, defaults)
    slice_view1 = rd1[4:7]
    assert [(4, 7, {"a": "alpha", "b": "bravo"})] == \
        list(slice_view1.iter_ranges())
    slice_view1["a"] = "foo"
    assert [(0, 4, {"a": "alpha", "b": "bravo"}),
            (4, 7, {"a": "foo", "b": "bravo"}),
            (7, 10, {"a": "alpha", "b": "bravo"})] \
        == rd1.get_ranges()
    assert [(4, 7, {"a": "foo", "b": "bravo"})] == \
        list(slice_view1.iter_ranges())
    rd1[5]["a"] = "bar"
    assert [(4, 5, {"a": "foo", "b": "bravo"}),
            (5, 6, {"a": "bar", "b": "bravo"}),
            (6, 7, {"a": "foo", "b": "bravo"})] == \
        list(slice_view1.iter_ranges())
def test_iter_values_keys():
    rd1 = RangeDictionary(10, defaults)
    aware = rd1.iter_all_values(key=("a", "b"), update_save=True)
    fast = rd1.iter_all_values(key=("b", "a"), update_save=False)
    assert [{'a': 'alpha', 'b': 'bravo'}, {'a': 'alpha', 'b': 'bravo'},
            {'a': 'alpha', 'b': 'bravo'}, {'a': 'alpha', 'b': 'bravo'},
            {'a': 'alpha', 'b': 'bravo'}, {'a': 'alpha', 'b': 'bravo'},
            {'a': 'alpha', 'b': 'bravo'}, {'a': 'alpha', 'b': 'bravo'},
            {'a': 'alpha', 'b': 'bravo'}, {'a': 'alpha', 'b': 'bravo'}] \
        == list(fast)
    rd1[4]["a"] = "Foo"
    rd1[6]["b"] = "Bar"
    assert [{'a': 'alpha', 'b': 'bravo'}, {'a': 'alpha', 'b': 'bravo'},
            {'a': 'alpha', 'b': 'bravo'}, {'a': 'alpha', 'b': 'bravo'},
            {'a': 'Foo', 'b': 'bravo'}, {'a': 'alpha', 'b': 'bravo'},
            {'a': 'alpha', 'b': 'Bar'}, {'a': 'alpha', 'b': 'bravo'},
            {'a': 'alpha', 'b': 'bravo'}, {'a': 'alpha', 'b': 'bravo'}] \
        == list(aware)
def test_iter_values():
    rd1 = RangeDictionary(10, defaults)
    slice_view1 = rd1[4:7]
    aware = slice_view1.iter_all_values("a", update_save=False)
    fast = slice_view1.iter_all_values("a", update_save=True)
    assert ["alpha", "alpha", "alpha"] == list(fast)
    rd1["a"] = "Foo"
    assert rd1["a"].get_single_value_all() == "Foo"
    assert ["Foo", "Foo", "Foo"] == list(aware)
def test_iter_values():
    rd1 = RangeDictionary(10, defaults)
    ranged_view1 = rd1[2, 3, 8]
    aware = ranged_view1.iter_all_values("a", update_save=False)
    fast = ranged_view1.iter_all_values("a", update_save=True)
    assert ["alpha", "alpha", "alpha"] == list(fast)
    rd1["a"] = "Foo"
    assert rd1["a"][0] == "Foo"
    assert ["Foo", "Foo", "Foo"] == list(aware)
def test_iter_values_keys():
    rd1 = RangeDictionary(10, defaults)
    single1 = rd1[4]
    aware = single1.iter_all_values(key=("a", "b"), update_save=False)
    fast = single1.iter_all_values(key=("b", "a"), update_save=True)
    assert [{'a': 'alpha', 'b': 'bravo'}] == list(fast)
    rd1["a"] = "Foo"
    assert rd1["a"].get_single_value_all() == "Foo"
    assert [{'a': 'Foo', 'b': 'bravo'}] == list(aware)
def test_iter_by_slice():
    rd1 = RangeDictionary(10)
    rl = RangedList(10, "gamma")
    rd1["g"] = rl
    rd1["a"] = "alpha"
    rd1["b"] = [
        "bravo0", "bravo1", "bravo2", "bravo3", "bravo4", "bravo5", "bravo6",
        "bravo7", "bravo8+", "bravo9"
    ]

    iterator = rd1.iter_values_by_slice(2, 4)
    assert {"a": "alpha", "b": "bravo2", "g": "gamma"} == next(iterator)
    assert {"a": "alpha", "b": "bravo3", "g": "gamma"} == next(iterator)
    with pytest.raises(StopIteration):
        next(iterator)

    iterator = rd1.iter_values_by_slice(2, 4, update_save=True)
    assert {"a": "alpha", "b": "bravo2", "g": "gamma"} == next(iterator)
    rd1["b"][3] = "new3"
    assert {"a": "alpha", "b": "new3", "g": "gamma"} == next(iterator)
    with pytest.raises(StopIteration):
        next(iterator)
    rd1["b"][3] = "bravo3"

    iterator = rd1.iter_values_by_slice(2, 4, key="b")
    assert "bravo2" == next(iterator)
    assert "bravo3" == next(iterator)
    with pytest.raises(StopIteration):
        next(iterator)

    iterator = rd1.iter_values_by_slice(2, 4, key="b", update_save=True)
    assert "bravo2" == next(iterator)
    rd1["b"][3] = "new3"
    assert "new3" == next(iterator)
    with pytest.raises(StopIteration):
        assert "OVERFLOW" == next(iterator)
    rd1["b"][3] = "bravo3"

    iterator = rd1.iter_values_by_slice(2, 4, key=["b", "a"])
    assert {"a": "alpha", "b": "bravo2"} == next(iterator)
    assert {"a": "alpha", "b": "bravo3"} == next(iterator)
    with pytest.raises(StopIteration):
        next(iterator)

    iterator = rd1.iter_values_by_slice(2, 4, key=["b", "a"], update_save=True)
    assert {"a": "alpha", "b": "bravo2"} == next(iterator)
    rd1["b"][3] = "new3"
    assert {"a": "alpha", "b": "new3"} == next(iterator)
    with pytest.raises(StopIteration):
        next(iterator)
    rd1["b"][3] = "bravo3"
def test_contains():
    rd1 = RangeDictionary(10)
    rl = RangedList(10, "gamma")
    rd1["g"] = rl
    rd1["a"] = "alpha"
    rd1["b"] = [
        "bravo", "bravo", "bravo", "bravo", "bravo", "bravo", "bravo", "bravo",
        "bravo", "bravo"
    ]
    assert "a" in rd1
    assert "alpha" not in rd1
    assert 1 in rd1
    assert 14 not in rd1
    with pytest.raises(KeyError):
        assert (rl in rd1)
def test_set():
    rd1 = RangeDictionary(10, defaults)
    single1 = rd1.view_factory([4])
    assert single1.get_value("a") == "alpha"
    single1["a"] = "foo"
    assert single1.get_value("a") == "foo"
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

from spinn_utilities.ranged import RangeDictionary

defaults = {"a": "alpha", "b": "bravo"}
rd = RangeDictionary(10, defaults)


def test_full():
    assert [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] == list(rd.ids())


def test_single():
    view = rd[2]
    assert [2] == list(view.ids())


def test_simple_slice():
    view = rd[2:6]
    assert [2, 3, 4, 5] == list(view.ids())
def test_set_list():
    rd1 = RangeDictionary(10, defaults)
    rl = RangedList(10, "gamma")
    rd1["g"] = rl
    new_dict = {"a": "alpha", "b": "bravo", "g": "gamma"}
    assert new_dict == rd1.get_value()
def test_set_range():
    rd1 = RangeDictionary(10, defaults)
    rd1["a"] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    assert rd1["a"] == [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
def test_ranges_by_key2():
    rd1 = RangeDictionary(10, defaults)
    assert [(0, 10, "alpha")] == rd1.get_ranges(key="a")
    rd1[4]["a"] = "foo"
    assert [(0, 4, "alpha"), (4, 5, "foo"), (5, 10, "alpha")] == \
        rd1.get_ranges(key="a")
def test_set_range_direct():
    rd1 = RangeDictionary(10, defaults)
    slice_view1 = rd1[4:7]
    assert "alpha" == slice_view1.get_value("a")
    slice_view1["a"] = "Foo"
    assert "Foo" == slice_view1.get_value("a")
def test_bad_set():
    rd1 = RangeDictionary(10)
    with pytest.raises(KeyError):
        rd1[2] = "This should not work"
    with pytest.raises(KeyError):
        rd1[rd] = "This should not work"
def test_ranges_by_key():
    rd1 = RangeDictionary(10, defaults)
    assert [(0, 10, "alpha")] == rd1.get_ranges(key="a")
def test_set_range_direct():
    rd1 = RangeDictionary(10, defaults)
    assert "alpha" == rd1["a"].get_single_value_all()
    rd1["a"] = "Foo"
    assert "Foo" == rd1["a"].get_single_value_all()