# Created By: Virgil Dupras # Created On: 2006/02/23 # Copyright 2015 Hardcoded Software (http://www.hardcoded.net) # This software is licensed under the "GPLv3" License as described in the "LICENSE" file, # which should be included with this package. The terms are also available at # http://www.gnu.org/licenses/gpl-3.0.html from hscommon.testutil import eq_ from ..markable import * def gen(): ml = MarkableList() ml.extend(list(range(10))) return ml def test_unmarked(): ml = gen() for i in ml: assert not ml.is_marked(i) def test_mark(): ml = gen() assert ml.mark(3) assert ml.is_marked(3) assert not ml.is_marked(2) def test_unmark(): ml = gen() ml.mark(4) assert ml.unmark(4) assert not ml.is_marked(4) def test_unmark_unmarked(): ml = gen() assert not ml.unmark(4) assert not ml.is_marked(4) def test_mark_twice_and_unmark(): ml = gen() assert ml.mark(5) assert not ml.mark(5) ml.unmark(5) assert not ml.is_marked(5) def test_mark_toggle(): ml = gen() ml.mark_toggle(6) assert ml.is_marked(6) ml.mark_toggle(6) assert not ml.is_marked(6) ml.mark_toggle(6) assert ml.is_marked(6) def test_is_markable(): class Foobar(Markable): def _is_markable(self, o): return o == 'foobar' f = Foobar() assert not f.is_marked('foobar') assert not f.mark('foo') assert not f.is_marked('foo') f.mark_toggle('foo') assert not f.is_marked('foo') f.mark('foobar') assert f.is_marked('foobar') ml = gen() ml.mark(11) assert not ml.is_marked(11) def test_change_notifications(): class Foobar(Markable): def _did_mark(self, o): self.log.append((True, o)) def _did_unmark(self, o): self.log.append((False, o)) f = Foobar() f.log = [] f.mark('foo') f.mark('foo') f.mark_toggle('bar') f.unmark('foo') f.unmark('foo') f.mark_toggle('bar') eq_([(True,'foo'),(True,'bar'),(False,'foo'),(False,'bar')],f.log) def test_mark_count(): ml = gen() eq_(0,ml.mark_count) ml.mark(7) eq_(1,ml.mark_count) ml.mark(11) eq_(1,ml.mark_count) def test_mark_none(): log = [] ml = gen() ml._did_unmark = lambda o: log.append(o) ml.mark(1) ml.mark(2) eq_(2,ml.mark_count) ml.mark_none() eq_(0,ml.mark_count) eq_([1,2],log) def test_mark_all(): ml = gen() eq_(0,ml.mark_count) ml.mark_all() eq_(10,ml.mark_count) assert ml.is_marked(1) def test_mark_invert(): ml = gen() ml.mark(1) ml.mark_invert() assert not ml.is_marked(1) assert ml.is_marked(2) def test_mark_while_inverted(): log = [] ml = gen() ml._did_unmark = lambda o:log.append((False,o)) ml._did_mark = lambda o:log.append((True,o)) ml.mark(1) ml.mark_invert() assert ml.mark_inverted assert ml.mark(1) assert ml.unmark(2) assert ml.unmark(1) ml.mark_toggle(3) assert not ml.is_marked(3) eq_(7,ml.mark_count) eq_([(True,1),(False,1),(True,2),(True,1),(True,3)],log) def test_remove_mark_flag(): ml = gen() ml.mark(1) ml._remove_mark_flag(1) assert not ml.is_marked(1) ml.mark(1) ml.mark_invert() assert not ml.is_marked(1) ml._remove_mark_flag(1) assert ml.is_marked(1) def test_is_marked_returns_false_if_object_not_markable(): class MyMarkableList(MarkableList): def _is_markable(self, o): return o != 4 ml = MyMarkableList() ml.extend(list(range(10))) ml.mark_invert() assert ml.is_marked(1) assert not ml.is_marked(4)