diff options
Diffstat (limited to 'tests/testsortedmap.vala')
-rw-r--r-- | tests/testsortedmap.vala | 1174 |
1 files changed, 1174 insertions, 0 deletions
diff --git a/tests/testsortedmap.vala b/tests/testsortedmap.vala new file mode 100644 index 0000000..abfbfc8 --- /dev/null +++ b/tests/testsortedmap.vala @@ -0,0 +1,1174 @@ +/* sortedset.vala + * + * Copyright (C) 2009-2011 Maciej Piechotka + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + + * This library 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 + * Lesser General Public License for more details. + + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Author: + * Maciej Piechotka <uzytkownik2@gmail.com> + */ + +public abstract class Gee.SortedMapTests : MapTests { + public SortedMapTests (string name) { + base (name); + add_test ("[SortedMap] key ordering", test_key_ordering); + add_test ("[SortedMap] first", test_first); + add_test ("[SortedMap] last", test_last); + add_test ("[SortedMap] iterator_at", test_iterator_at); + add_test ("[SortedMap] lower", test_lower); + add_test ("[SortedMap] higher", test_higher); + add_test ("[SortedMap] floor", test_floor); + add_test ("[SortedMap] ceil", test_ceil); + get_suite ().add_suite (new SubMapTests (this, SubMapTests.Type.HEAD).get_suite ()); + get_suite ().add_suite (new SubMapTests (this, SubMapTests.Type.TAIL).get_suite ()); + get_suite ().add_suite (new SubMapTests (this, SubMapTests.Type.SUB).get_suite ()); + get_suite ().add_suite (new SubMapTests (this, SubMapTests.Type.EMPTY).get_suite ()); + } + + public void test_key_ordering () { + var test_sorted_map = test_map as SortedMap<string,string>; + + // Check the map exists + assert (test_sorted_map != null); + + test_sorted_map.set ("one", "one"); + test_sorted_map.set ("two", "two"); + test_sorted_map.set ("three", "three"); + test_sorted_map.set ("four", "four"); + test_sorted_map.set ("five", "five"); + test_sorted_map.set ("six", "six"); + test_sorted_map.set ("seven", "seven"); + test_sorted_map.set ("eight", "eight"); + test_sorted_map.set ("nine", "nine"); + test_sorted_map.set ("ten", "ten"); + test_sorted_map.set ("eleven", "eleven"); + test_sorted_map.set ("twelve", "twelve"); + + Iterator<string> iterator = test_sorted_map.keys.iterator (); + assert (iterator.next ()); + assert (iterator.get () == "eight"); + assert (iterator.next ()); + assert (iterator.get () == "eleven"); + assert (iterator.next ()); + assert (iterator.get () == "five"); + assert (iterator.next ()); + assert (iterator.get () == "four"); + assert (iterator.next ()); + assert (iterator.get () == "nine"); + assert (iterator.next ()); + assert (iterator.get () == "one"); + assert (iterator.next ()); + assert (iterator.get () == "seven"); + assert (iterator.next ()); + assert (iterator.get () == "six"); + assert (iterator.next ()); + assert (iterator.get () == "ten"); + assert (iterator.next ()); + assert (iterator.get () == "three"); + assert (iterator.next ()); + assert (iterator.get () == "twelve"); + assert (iterator.next ()); + assert (iterator.get () == "two"); + assert (iterator.next () == false); + } + + public void test_first () { + var test_sorted_map = test_map as SortedMap<string,string>; + var keys = test_sorted_map.ascending_keys; + var entries = test_sorted_map.ascending_entries; + + // Check the map exists + assert (test_sorted_map != null); + + if (Test.trap_fork (0, TestTrapFlags.SILENCE_STDOUT | + TestTrapFlags.SILENCE_STDERR)) { + keys.first (); + Posix.exit (0); + } + Test.trap_assert_failed (); + + if (Test.trap_fork (0, TestTrapFlags.SILENCE_STDOUT | + TestTrapFlags.SILENCE_STDERR)) { + entries.first (); + Posix.exit (0); + } + Test.trap_assert_failed (); + + test_sorted_map.set ("one", "one"); + test_sorted_map.set ("two", "two"); + test_sorted_map.set ("three", "three"); + test_sorted_map.set ("four", "four"); + test_sorted_map.set ("five", "five"); + test_sorted_map.set ("six", "six"); + test_sorted_map.set ("seven", "seven"); + test_sorted_map.set ("eight", "eight"); + test_sorted_map.set ("nine", "nine"); + test_sorted_map.set ("ten", "ten"); + test_sorted_map.set ("eleven", "eleven"); + test_sorted_map.set ("twelve", "twelve"); + + assert (keys.first () == "eight"); + /*assert_entry (entries.first (), "eight", "eight");*/ + } + + public void test_last () { + var test_sorted_map = test_map as SortedMap<string,string>; + var keys = test_sorted_map.ascending_keys; + var entries = test_sorted_map.ascending_entries; + // Check the map exists + assert (test_sorted_map != null); + + if (Test.trap_fork (0, TestTrapFlags.SILENCE_STDOUT | + TestTrapFlags.SILENCE_STDERR)) { + keys.last (); + Posix.exit (0); + } + Test.trap_assert_failed (); + + if (Test.trap_fork (0, TestTrapFlags.SILENCE_STDOUT | + TestTrapFlags.SILENCE_STDERR)) { + entries.last (); + Posix.exit (0); + } + Test.trap_assert_failed (); + + test_sorted_map.set ("one", "one"); + test_sorted_map.set ("two", "two"); + test_sorted_map.set ("three", "three"); + test_sorted_map.set ("four", "four"); + test_sorted_map.set ("five", "five"); + test_sorted_map.set ("six", "six"); + test_sorted_map.set ("seven", "seven"); + test_sorted_map.set ("eight", "eight"); + test_sorted_map.set ("nine", "nine"); + test_sorted_map.set ("ten", "ten"); + test_sorted_map.set ("eleven", "eleven"); + test_sorted_map.set ("twelve", "twelve"); + + assert (keys.last () == "two"); + assert_entry (entries.last (), "two", "two"); + } + + public void test_iterator_at () { + var test_sorted_map = test_map as SortedMap<string,string>; + var keys = test_sorted_map.ascending_keys; + var entries = test_sorted_map.ascending_entries; + + test_map.set ("one", "one"); + test_map.set ("two", "two"); + test_map.set ("three", "three"); + + var keys_iter = keys.iterator_at ("one"); + assert (keys_iter != null); + assert (keys_iter.get () == "one"); + + var entries_iter = entries.iterator_at (entry_for ("one", "one")); + assert (entries_iter != null); + assert_entry (entries_iter.get (), "one", "one"); + + keys_iter = keys.iterator_at ("two"); + assert (keys_iter != null); + assert (keys_iter.get () == "two"); + + entries_iter = entries.iterator_at (entry_for ("two", "two")); + assert (entries_iter != null); + assert_entry (entries_iter.get (), "two", "two"); + + keys_iter = keys.iterator_at ("three"); + assert (keys_iter != null); + assert (keys_iter.get () == "three"); + + entries_iter = entries.iterator_at (entry_for ("three", "three")); + assert (entries_iter != null); + assert_entry (entries_iter.get (), "three", "three"); + + keys_iter = keys.iterator_at ("zero"); + assert (keys_iter == null); + + entries_iter = entries.iterator_at (entry_for ("zero", "zero")); + assert (entries_iter == null); + } + + public void test_lower () { + var test_sorted_map = test_map as SortedMap<string,string>; + var keys = test_sorted_map.ascending_keys; + var entries = test_sorted_map.ascending_entries; + + assert (keys.lower ("one") == null); + + test_sorted_map.set ("one", "one"); + test_sorted_map.set ("two", "two"); + test_sorted_map.set ("three", "three"); + test_sorted_map.set ("four", "four"); + test_sorted_map.set ("five", "five"); + test_sorted_map.set ("six", "six"); + + assert (keys.lower ("one") == "four"); + assert_entry (entries.lower (entry_for ("one", "one")), "four", "four"); + + assert (keys.lower ("o") == "four"); + assert_entry (entries.lower (entry_for ("o", "one")), "four", "four"); + + assert (keys.lower ("two") == "three"); + assert_entry (entries.lower (entry_for ("two", "two")), "three", "three"); + + assert (keys.lower ("t") == "six"); + assert_entry (entries.lower (entry_for ("t", "two")), "six", "six"); + + assert (keys.lower ("three") == "six"); + assert_entry (entries.lower (entry_for ("three", "three")), "six", "six"); + + assert (keys.lower ("four") == "five"); + assert_entry (entries.lower (entry_for ("four", "four")), "five", "five"); + + assert (keys.lower ("f") == null); + assert (entries.lower (entry_for ("f", "four")) == null); + + assert (keys.lower ("five") == null); + assert (entries.lower (entry_for ("five", "five")) == null); + + assert (keys.lower ("six") == "one"); + assert_entry (entries.lower (entry_for ("six", "six")), "one", "one"); + + assert (keys.lower ("s") == "one"); + assert_entry (entries.lower (entry_for ("s", "six")), "one", "one"); + + } + + public void test_higher () { + var test_sorted_map = test_map as SortedMap<string,string>; + var keys = test_sorted_map.ascending_keys; + var entries = test_sorted_map.ascending_entries; + + assert (keys.higher ("one") == null); + + test_sorted_map.set ("one", "one"); + test_sorted_map.set ("two", "two"); + test_sorted_map.set ("three", "three"); + test_sorted_map.set ("four", "four"); + test_sorted_map.set ("five", "five"); + test_sorted_map.set ("six", "six"); + + assert (keys.higher ("one") == "six"); + assert_entry (entries.higher (entry_for ("one", "one")), "six", "six"); + + assert (keys.higher ("o") == "one"); + assert_entry (entries.higher (entry_for ("o", "one")), "one", "one"); + + assert (keys.higher ("two") == null); + assert (entries.higher (entry_for ("two", "two")) == null); + + assert (keys.higher ("t") == "three"); + assert_entry (entries.higher (entry_for ("t", "two")), "three", "three"); + + assert (keys.higher ("three") == "two"); + assert_entry (entries.higher (entry_for ("three", "three")), "two", "two"); + + assert (keys.higher ("four") == "one"); + assert_entry (entries.higher (entry_for ("four", "four")), "one", "one"); + + assert (keys.higher ("f") == "five"); + assert_entry (entries.higher (entry_for ("f", "four")), "five", "five"); + + assert (keys.higher ("five") == "four"); + assert_entry (entries.higher (entry_for ("five", "five")), "four", "four"); + + assert (keys.higher ("six") == "three"); + assert_entry (entries.higher (entry_for ("six", "six")), "three", "three"); + + assert (keys.higher ("s") == "six"); + assert_entry (entries.higher (entry_for ("s", "six")), "six", "six"); + } + + public void test_floor () { + var test_sorted_map = test_map as SortedMap<string,string>; + var keys = test_sorted_map.ascending_keys; + var entries = test_sorted_map.ascending_entries; + + assert (keys.floor ("one") == null); + + test_sorted_map.set ("one", "one"); + test_sorted_map.set ("two", "two"); + test_sorted_map.set ("three", "three"); + test_sorted_map.set ("four", "four"); + test_sorted_map.set ("five", "five"); + test_sorted_map.set ("six", "six"); + + assert (keys.floor ("one") == "one"); + assert_entry (entries.floor (entry_for ("one", "one")), "one", "one"); + + assert (keys.floor ("o") == "four"); + assert_entry (entries.floor (entry_for ("o", "one")), "four", "four"); + + assert (keys.floor ("two") == "two"); + assert_entry (entries.floor (entry_for ("two", "two")), "two", "two"); + + assert (keys.floor ("t") == "six"); + assert_entry (entries.floor (entry_for ("t", "two")), "six", "six"); + + assert (keys.floor ("three") == "three"); + assert_entry (entries.floor (entry_for ("three", "three")), "three", "three"); + + assert (keys.floor ("four") == "four"); + assert_entry (entries.floor (entry_for ("four", "four")), "four", "four"); + + assert (keys.floor ("f") == null); + assert (entries.floor (entry_for ("f", "four")) == null); + + assert (keys.floor ("five") == "five"); + assert_entry (entries.floor (entry_for ("five", "five")), "five", "five"); + + assert (keys.floor ("six") == "six"); + assert_entry (entries.floor (entry_for ("six", "six")), "six", "six"); + + assert (keys.floor ("s") == "one"); + assert_entry (entries.floor (entry_for ("s", "six")), "one", "one"); + } + + public void test_ceil () { + var test_sorted_map = test_map as SortedMap<string,string>; + var keys = test_sorted_map.ascending_keys; + var entries = test_sorted_map.ascending_entries; + + assert (keys.ceil ("one") == null); + + test_sorted_map.set ("one", "one"); + test_sorted_map.set ("two", "two"); + test_sorted_map.set ("three", "three"); + test_sorted_map.set ("four", "four"); + test_sorted_map.set ("five", "five"); + test_sorted_map.set ("six", "six"); + + assert (keys.ceil ("one") == "one"); + assert_entry (entries.ceil (entry_for ("one", "one")), "one", "one"); + + assert (keys.ceil ("o") == "one"); + assert_entry (entries.ceil (entry_for ("o", "one")), "one", "one"); + + assert (keys.ceil ("two") == "two"); + assert_entry (entries.ceil (entry_for ("two", "two")), "two", "two"); + + assert (keys.ceil ("t") == "three"); + assert_entry (entries.ceil (entry_for ("t", "two")), "three", "three"); + + assert (keys.ceil ("three") == "three"); + assert_entry (entries.ceil (entry_for ("three", "three")), "three", "three"); + + assert (keys.ceil ("four") == "four"); + assert_entry (entries.ceil (entry_for ("four", "four")), "four", "four"); + + assert (keys.ceil ("f") == "five"); + assert_entry (entries.ceil (entry_for ("f", "four")), "five", "five"); + + assert (keys.ceil ("five") == "five"); + assert_entry (entries.ceil (entry_for ("five", "five")), "five", "five"); + + assert (keys.ceil ("six") == "six"); + assert_entry (entries.ceil (entry_for ("six", "six")), "six", "six"); + + assert (keys.ceil ("s") == "six"); + assert_entry (entries.ceil (entry_for ("s", "six")), "six", "six"); + } + + public class SubMapTests : Gee.TestCase { + private SortedMap<string,string> master; + private SortedMap<string,string> submap; + private SortedMapTests test; + public enum Type { + HEAD, + TAIL, + SUB, + EMPTY; + public unowned string to_string () { + switch (this) { + case Type.HEAD: return "Head"; + case Type.TAIL: return "Tail"; + case Type.SUB: return "Range"; + case Type.EMPTY: return "Empty"; + default: assert_not_reached (); + } + } + } + private Type type; + + public SubMapTests (SortedMapTests test, Type type) { + base ("%s Submap".printf (type.to_string ())); + this.test = test; + this.type = type; + add_test ("[Map] has_key, size and is_empty", + test_has_key_size_is_empty); + add_test ("[Map] keys", test_keys); + add_test ("[Map] values", test_values); + add_test ("[Map] entries", test_entries); + add_test ("[Map] get", test_get); + add_test ("[Map] set", test_set); + add_test ("[Map] unset", test_unset); + add_test ("[Map] clear", test_clear); + add_test ("[Map] iterators", test_iterators); + add_test ("[SortedMap] boundaries", test_boundaries); + add_test ("[SortedMap] lower", test_lower); + add_test ("[SortedMap] higher", test_higher); + add_test ("[SortedMap] floor", test_floor); + add_test ("[SortedMap] ceil", test_ceil); + add_test ("[SortedMap] iterator_at", test_iterator_at); + add_test ("[SortedMap] submap and subsets", test_submap_and_subsets); + } + + public override void set_up () { + test.set_up (); + master = test.test_map as SortedMap<string,string>; + switch (type) { + case Type.HEAD: + submap = master.head_map ("one"); break; + case Type.TAIL: + submap = master.tail_map ("six"); break; + case Type.SUB: + submap = master.sub_map ("four", "three"); break; + case Type.EMPTY: + submap = master.sub_map ("three", "four"); break; + default: + assert_not_reached (); + } + } + + public override void tear_down () { + test.tear_down (); + } + + protected void set_default_values (out string[] contains = null, out string[] not_contains = null) { + master.set ("one", "one"); + master.set ("two", "two"); + master.set ("three", "three"); + master.set ("four", "four"); + master.set ("five", "five"); + master.set ("six", "six"); + switch (type) { + case Type.HEAD: + contains = {"five", "four"}; + not_contains = {"one", "two", "three", "six"}; + break; + case Type.TAIL: + contains = {"six", "three", "two"}; + not_contains = {"one", "four", "five"}; + break; + case Type.SUB: + contains = {"four", "one", "six"}; + not_contains = {"two", "three", "five"}; + break; + case Type.EMPTY: + contains = {}; + not_contains = {"one", "two", "three", "four", "five", "six"}; + break; + default: + assert_not_reached (); + } + } + + public void test_has_key_size_is_empty () { + string[] contains, not_contains; + + set_default_values (out contains, out not_contains); + + assert (submap.size == contains.length); + assert (submap.is_empty == (contains.length == 0)); + + foreach (var s in contains) { + assert (submap.has_key (s)); + assert (submap.has (s, s)); + } + foreach (var s in not_contains) { + assert (!submap.has_key (s)); + assert (!submap.has (s, s)); + } + } + + public void test_get () { + string[] contains, not_contains; + + set_default_values (out contains, out not_contains); + + foreach (var s in contains) { + assert (submap.get (s) == s); + } + } + + public void test_keys () { + var keys = submap.keys; + + assert (keys.size == 0); + assert (keys.is_empty); + + string[] contains, not_contains; + + set_default_values (out contains, out not_contains); + + assert (keys.size == contains.length); + foreach (var s in contains) + assert (keys.contains (s)); + foreach (var s in not_contains) + assert (!keys.contains (s)); + + if (Test.trap_fork (0, TestTrapFlags.SILENCE_STDOUT | + TestTrapFlags.SILENCE_STDERR)) { + keys.add ("three"); + Posix.exit (0); + } + Test.trap_assert_failed (); + + if (Test.trap_fork (0, TestTrapFlags.SILENCE_STDOUT | + TestTrapFlags.SILENCE_STDERR)) { + keys.remove ("three"); + Posix.exit (0); + } + Test.trap_assert_failed (); + } + + public void test_values () { + var values = submap.values; + + assert (values.size == 0); + assert (values.is_empty); + + string[] contains, not_contains; + + set_default_values (out contains, out not_contains); + + assert (values.size == contains.length); + foreach (var s in contains) + assert (values.contains (s)); + foreach (var s in not_contains) + assert (!values.contains (s)); + + if (Test.trap_fork (0, TestTrapFlags.SILENCE_STDOUT | + TestTrapFlags.SILENCE_STDERR)) { + values.add ("three"); + Posix.exit (0); + } + Test.trap_assert_failed (); + + if (Test.trap_fork (0, TestTrapFlags.SILENCE_STDOUT | + TestTrapFlags.SILENCE_STDERR)) { + values.remove ("three"); + Posix.exit (0); + } + Test.trap_assert_failed (); + } + + public void test_entries () { + var entries = submap.entries; + + assert (entries.size == 0); + assert (entries.is_empty); + + string[] contains, not_contains; + + set_default_values (out contains, out not_contains); + + assert (entries.size == contains.length); + foreach (var s in contains) + assert (entries.contains (MapTests.entry_for (s, s))); + foreach (var s in not_contains) + assert (!entries.contains (MapTests.entry_for (s, s))); + + if (Test.trap_fork (0, TestTrapFlags.SILENCE_STDOUT | + TestTrapFlags.SILENCE_STDERR)) { + entries.add (MapTests.entry_for ("three", "three")); + Posix.exit (0); + } + Test.trap_assert_failed (); + + if (Test.trap_fork (0, TestTrapFlags.SILENCE_STDOUT | + TestTrapFlags.SILENCE_STDERR)) { + entries.remove (MapTests.entry_for ("three", "three")); + Posix.exit (0); + } + Test.trap_assert_failed (); + } + + public void test_set () { + string[] contains, not_contains; + + set_default_values (out contains, out not_contains); + + string[] success, fail; + switch (type) { + case Type.HEAD: + success = {"a", "o"}; + fail = {"oz", "z"}; + break; + case Type.TAIL: + success = {"siz", "z"}; + fail = {"sia", "a"}; + break; + case Type.SUB: + success = {"o", "th"}; + fail = {"f", "u"}; + break; + case Type.EMPTY: + success = {}; + fail = {"o", "th", "f", "u"}; + break; + default: + assert_not_reached (); + } + + foreach (var s in success) { + submap.set (s, s); + assert (submap.has (s, s)); + assert (master.has (s, s)); + } + + foreach (var s in fail) { + submap.set (s, s); + assert (!submap.has_key (s)); + assert (!master.has_key (s)); + } + + assert (master.size == 6 + success.length); + } + + public void test_unset () { + string[] contains, not_contains; + + set_default_values (out contains, out not_contains); + + foreach (var s in contains) { + string? value; + assert (submap.unset (s, out value)); + assert (value == s); + assert (!master.has_key (s)); + } + foreach (var s in not_contains) { + assert (!submap.unset (s)); + assert (master.has (s, s)); + } + + assert (master.size == 6 - contains.length); + } + + public void test_clear () { + string[] contains, not_contains; + + set_default_values (out contains, out not_contains); + + submap.clear (); + + foreach (var s in contains) { + assert (!master.has_key (s)); + } + foreach (var s in not_contains) { + assert (!submap.unset (s)); + assert (master.has (s, s)); + } + + assert (master.size == 6 - contains.length); + } + + public void test_iterators () { + string[] contains, not_contains; + + var _map_iter = submap.map_iterator (); + + assert (!_map_iter.has_next ()); + assert (!_map_iter.next ()); + + set_default_values (out contains, out not_contains); + + var i = 0; + _map_iter = submap.map_iterator (); + while (_map_iter.next ()) { + assert (_map_iter.get_key () == contains[i]); + assert (_map_iter.get_value () == contains[i]); + i++; + } + assert (i == contains.length); + + i = 0; + foreach (var k in submap.keys) + assert (k == contains[i++]); + assert (i == contains.length); + + i = 0; + foreach (var e in submap.entries) { + MapTests.assert_entry (e, contains[i], contains[i]); + i++; + } + assert (i == contains.length); + + if (type != Type.EMPTY) { + var map_iter = submap.map_iterator (); + assert (map_iter.next ()); + + assert (map_iter.get_key () == contains[0]); + assert (map_iter.get_value () == contains[0]); + + assert (map_iter.has_next ()); + assert (map_iter.next ()); + assert (map_iter.get_key () == contains[1]); + assert (map_iter.get_value () == contains[1]); + + // Repeat for keys + master.clear (); + set_default_values (out contains, out not_contains); + var keys_iter = submap.ascending_keys.iterator (); + + assert (keys_iter.has_next ()); + assert (keys_iter.next ()); + + assert (keys_iter.get () == contains[0]); + assert (keys_iter.has_next ()); + assert (keys_iter.next ()); + assert (keys_iter.get () == contains[1]); + + // Repeat for entries + master.clear (); + set_default_values (out contains, out not_contains); + var entries_iter = submap.ascending_entries.iterator (); + + assert (entries_iter.has_next ()); + assert (entries_iter.next ()); + + MapTests.assert_entry (entries_iter.get (), contains[0], contains[0]); + assert (entries_iter.has_next ()); + assert (entries_iter.next ()); + MapTests.assert_entry (entries_iter.get (), contains[1], contains[1]); + } else { + var keys_iter = submap.ascending_keys.iterator (); + if (Test.trap_fork (0, TestTrapFlags.SILENCE_STDOUT | + TestTrapFlags.SILENCE_STDERR)) { + keys_iter.remove (); + Posix.exit (0); + } + Test.trap_assert_failed (); + } + } + + public void test_boundaries () { + var keys = submap.ascending_keys; + var entries = submap.ascending_entries; + + string[] contains, not_contains; + + set_default_values (out contains, out not_contains); + + switch (type) { + case Type.HEAD: + assert (keys.first () == "five"); + assert (keys.last () == "four"); + assert_entry (entries.first (), "five", "five"); + assert_entry (entries.last (), "four", "four"); + break; + case Type.TAIL: + assert (keys.first () == "six"); + assert (keys.last () == "two"); + assert_entry (entries.first (), "six", "six"); + assert_entry (entries.last (), "two", "two"); + break; + case Type.SUB: + assert (keys.first () == "four"); + assert (keys.last () == "six"); + assert_entry (entries.first (), "four", "four"); + assert_entry (entries.last (), "six", "six"); + break; + case Type.EMPTY: + if (Test.trap_fork (0, TestTrapFlags.SILENCE_STDOUT | + TestTrapFlags.SILENCE_STDERR)) { + keys.first (); + Posix.exit (0); + } + Test.trap_assert_failed (); + if (Test.trap_fork (0, TestTrapFlags.SILENCE_STDOUT | + TestTrapFlags.SILENCE_STDERR)) { + keys.last (); + Posix.exit (0); + } + Test.trap_assert_failed (); + if (Test.trap_fork (0, TestTrapFlags.SILENCE_STDOUT | + TestTrapFlags.SILENCE_STDERR)) { + entries.first (); + Posix.exit (0); + } + Test.trap_assert_failed (); + if (Test.trap_fork (0, TestTrapFlags.SILENCE_STDOUT | + TestTrapFlags.SILENCE_STDERR)) { + entries.last (); + Posix.exit (0); + } + Test.trap_assert_failed (); + break; + default: + assert_not_reached (); + } + } + + public void test_lower () { + string[] contains, not_contains; + var keys = submap.ascending_keys; + var entries = submap.ascending_entries; + + set_default_values (out contains, out not_contains); + + switch (type) { + case Type.HEAD: + assert (keys.lower ("a") == null); + assert (entries.lower (MapTests.entry_for ("a", "a")) == null); + assert (keys.lower ("five") == null); + assert (entries.lower (MapTests.entry_for ("five", "five")) == null); + assert (keys.lower ("four") == "five"); + MapTests.assert_entry (entries.lower (MapTests.entry_for ("four", "four")), "five", "five"); + assert (keys.lower ("six") == "four"); + MapTests.assert_entry (entries.lower (MapTests.entry_for ("six", "six")), "four", "four"); + break; + case Type.TAIL: + assert (keys.lower ("one") == null); + assert (entries.lower (MapTests.entry_for ("one", "one")) == null); + assert (keys.lower ("six") == null); + assert (entries.lower (MapTests.entry_for ("six", "six")) == null); + assert (keys.lower ("three") == "six"); + MapTests.assert_entry (entries.lower (MapTests.entry_for ("three", "three")), "six", "six"); + assert (keys.lower ("two") == "three"); + MapTests.assert_entry (entries.lower (MapTests.entry_for ("two", "two")), "three", "three"); + assert (keys.lower ("z") == "two"); + MapTests.assert_entry (entries.lower (MapTests.entry_for ("z", "z")), "two", "two"); + break; + case Type.SUB: + assert (keys.lower ("five") == null); + assert (entries.lower (MapTests.entry_for ("five", "five")) == null); + assert (keys.lower ("four") == null); + assert (entries.lower (MapTests.entry_for ("four", "four")) == null); + assert (keys.lower ("one") == "four"); + MapTests.assert_entry (entries.lower (MapTests.entry_for ("one", "one")), "four", "four"); + assert (keys.lower ("six") == "one"); + MapTests.assert_entry (entries.lower (MapTests.entry_for ("six", "six")), "one", "one"); + assert (keys.lower ("three") == "six"); + MapTests.assert_entry (entries.lower (MapTests.entry_for ("three", "three")), "six", "six"); + break; + case Type.EMPTY: + assert (keys.lower ("six") == null); + assert (entries.lower (MapTests.entry_for ("six", "six")) == null); + break; + default: + assert_not_reached (); + } + } + + public void test_higher () { + string[] contains, not_contains; + var keys = submap.ascending_keys; + var entries = submap.ascending_entries; + + set_default_values (out contains, out not_contains); + + switch (type) { + case Type.HEAD: + assert (keys.higher ("a") == "five"); + MapTests.assert_entry (entries.higher (MapTests.entry_for ("a", "a")), "five", "five"); + assert (keys.higher ("five") == "four"); + MapTests.assert_entry (entries.higher (MapTests.entry_for ("five", "five")), "four", "four"); + assert (keys.higher ("four") == null); + assert (entries.higher (MapTests.entry_for ("four", "four")) == null); + assert (keys.higher ("six") == null); + assert (entries.higher (MapTests.entry_for ("six", "six")) == null); + break; + case Type.TAIL: + assert (keys.higher ("one") == "six"); + MapTests.assert_entry (entries.higher (MapTests.entry_for ("one", "one")), "six", "six"); + assert (keys.higher ("six") == "three"); + MapTests.assert_entry (entries.higher (MapTests.entry_for ("six", "six")), "three", "three"); + assert (keys.higher ("three") == "two"); + MapTests.assert_entry (entries.higher (MapTests.entry_for ("three", "three")), "two", "two"); + assert (keys.higher ("two") == null); + assert (entries.higher (MapTests.entry_for ("two", "two")) == null); + assert (keys.higher ("z") == null); + assert (entries.higher (MapTests.entry_for ("z", "z")) == null); + break; + case Type.SUB: + assert (keys.higher ("five") == "four"); + MapTests.assert_entry (entries.higher (MapTests.entry_for ("five", "five")), "four", "four"); + assert (keys.higher ("four") == "one"); + MapTests.assert_entry (entries.higher (MapTests.entry_for ("four", "four")), "one", "one"); + assert (keys.higher ("one") == "six"); + MapTests.assert_entry (entries.higher (MapTests.entry_for ("one", "one")), "six", "six"); + assert (keys.higher ("six") == null); + assert (entries.higher (MapTests.entry_for ("six", "six")) == null); + assert (keys.higher ("three") == null); + assert (entries.higher (MapTests.entry_for ("three", "three")) == null); + break; + case Type.EMPTY: + assert (keys.higher ("six") == null); + assert (entries.higher (MapTests.entry_for ("six", "six")) == null); + break; + default: + assert_not_reached (); + } + } + + public void test_floor () { + string[] contains, not_contains; + var keys = submap.ascending_keys; + var entries = submap.ascending_entries; + + set_default_values (out contains, out not_contains); + + switch (type) { + case Type.HEAD: + assert (keys.floor ("a") == null); + assert (entries.floor (MapTests.entry_for ("a", "a")) == null); + assert (keys.floor ("five") == "five"); + MapTests.assert_entry (entries.floor (MapTests.entry_for ("five", "fiv")), "five", "five"); + assert (keys.floor ("four") == "four"); + MapTests.assert_entry (entries.floor (MapTests.entry_for ("four", "four")), "four", "four"); + assert (keys.floor ("six") == "four"); + MapTests.assert_entry (entries.floor (MapTests.entry_for ("six", "six")), "four", "four"); + break; + case Type.TAIL: + assert (keys.floor ("one") == null); + assert (entries.floor (MapTests.entry_for ("one", "one")) == null); + assert (keys.floor ("six") == "six"); + MapTests.assert_entry (entries.floor (MapTests.entry_for ("six", "six")), "six", "six"); + assert (keys.floor ("three") == "three"); + MapTests.assert_entry (entries.floor (MapTests.entry_for ("three", "three")), "three", "three"); + assert (keys.floor ("two") == "two"); + MapTests.assert_entry (entries.floor (MapTests.entry_for ("two", "two")), "two", "two"); + assert (keys.floor ("z") == "two"); + MapTests.assert_entry (entries.floor (MapTests.entry_for ("z", "z")), "two", "two"); + break; + case Type.SUB: + assert (keys.floor ("five") == null); + assert (entries.floor (MapTests.entry_for ("five", "five")) == null); + assert (keys.floor ("four") == "four"); + MapTests.assert_entry (entries.floor (MapTests.entry_for ("four", "four")), "four", "four"); + assert (keys.floor ("one") == "one"); + MapTests.assert_entry (entries.floor (MapTests.entry_for ("one", "one")), "one", "one"); + assert (keys.floor ("six") == "six"); + MapTests.assert_entry (entries.floor (MapTests.entry_for ("six", "six")), "six", "six"); + assert (keys.floor ("three") == "six"); + MapTests.assert_entry (entries.floor (MapTests.entry_for ("three", "three")), "six", "six"); + break; + case Type.EMPTY: + assert (keys.floor ("six") == null); + assert (entries.floor (MapTests.entry_for ("six", "six")) == null); + break; + default: + assert_not_reached (); + } + } + + public void test_ceil () { + string[] contains, not_contains; + var keys = submap.ascending_keys; + var entries = submap.ascending_entries; + + set_default_values (out contains, out not_contains); + + switch (type) { + case Type.HEAD: + assert (keys.ceil ("a") == "five"); + MapTests.assert_entry (entries.ceil (MapTests.entry_for ("a", "a")), "five", "five"); + assert (keys.ceil ("five") == "five"); + MapTests.assert_entry (entries.ceil (MapTests.entry_for ("five", "five")), "five", "five"); + assert (keys.ceil ("four") == "four"); + MapTests.assert_entry (entries.ceil (MapTests.entry_for ("four", "four")), "four", "four"); + assert (keys.ceil ("six") == null); + assert (entries.ceil (MapTests.entry_for ("six", "six")) == null); + break; + case Type.TAIL: + assert (keys.ceil ("one") == "six"); + MapTests.assert_entry (entries.ceil (MapTests.entry_for ("one", "one")), "six", "six"); + assert (keys.ceil ("six") == "six"); + MapTests.assert_entry (entries.ceil (MapTests.entry_for ("six", "six")), "six", "six"); + assert (keys.ceil ("three") == "three"); + MapTests.assert_entry (entries.ceil (MapTests.entry_for ("three", "three")), "three", "three"); + assert (keys.ceil ("two") == "two"); + MapTests.assert_entry (entries.ceil (MapTests.entry_for ("two", "two")), "two", "two"); + assert (keys.ceil ("z") == null); + assert (entries.ceil (MapTests.entry_for ("z", "z")) == null); + break; + case Type.SUB: + assert (keys.ceil ("five") == "four"); + MapTests.assert_entry (entries.ceil (MapTests.entry_for ("five", "five")), "four", "four"); + assert (keys.ceil ("four") == "four"); + MapTests.assert_entry (entries.ceil (MapTests.entry_for ("four", "four")), "four", "four"); + assert (keys.ceil ("one") == "one"); + MapTests.assert_entry (entries.ceil (MapTests.entry_for ("one", "one")), "one", "one"); + assert (keys.ceil ("six") == "six"); + MapTests.assert_entry (entries.ceil (MapTests.entry_for ("six", "six")), "six", "six"); + assert (keys.ceil ("three") == null); + assert (entries.ceil (MapTests.entry_for ("three", "three")) == null); + break; + case Type.EMPTY: + assert (keys.ceil ("six") == null); + assert (entries.ceil (MapTests.entry_for ("six", "six")) == null); + break; + default: + assert_not_reached (); + } + } + + public void test_iterator_at () { + string[] contains, not_contains; + var keys = submap.ascending_keys; + var entries = submap.ascending_entries; + + set_default_values (out contains, out not_contains); + + foreach (var s in contains) { + var key_iter = keys.iterator_at (s); + var entry_iter = entries.iterator_at (MapTests.entry_for (s, s)); + assert (key_iter != null); + assert (key_iter.get () == s); + MapTests.assert_entry (entry_iter.get (), s, s); + } + foreach (var s in not_contains) { + var key_iter = keys.iterator_at (s); + var entry_iter = entries.iterator_at (MapTests.entry_for (s, s)); + assert (key_iter == null); + assert (entry_iter == null); + } + assert (keys.iterator_at ("seven") == null); + assert (entries.iterator_at (MapTests.entry_for ("seven", "seven")) == null); + } + + public void test_submap_and_subsets () { + string[] contains, not_contains; + var keys = submap.ascending_keys; + var entries = submap.ascending_entries; + + set_default_values (out contains, out not_contains); + + switch (type) { + case Type.HEAD: + var subsubmap = submap.head_map ("four"); + var keyssubset = keys.head_set ("four"); + var entriessubset = entries.head_set (MapTests.entry_for ("four", "four")); + + assert (subsubmap.size == 1); + assert (keyssubset.size == 1); + assert (entriessubset.size == 1); + + subsubmap = submap.tail_map ("four"); + keyssubset = keys.tail_set ("four"); + entriessubset = entries.tail_set (MapTests.entry_for ("four", "four")); + + assert (subsubmap.size == 1); + assert (keyssubset.size == 1); + assert (entriessubset.size == 1); + + subsubmap = submap.sub_map ("four", "one"); + keyssubset = keys.sub_set ("four", "one"); + entriessubset = entries.sub_set (MapTests.entry_for ("four", "four"), MapTests.entry_for ("one", "one")); + + assert (subsubmap.size == 1); + assert (keyssubset.size == 1); + assert (entriessubset.size == 1); + + subsubmap = submap.sub_map ("four", "four"); + keyssubset = keys.sub_set ("four", "four"); + entriessubset = entries.sub_set (MapTests.entry_for ("four", "four"), MapTests.entry_for ("four", "four")); + + assert (subsubmap.size == 0); + assert (keyssubset.size == 0); + assert (entriessubset.size == 0); + break; + case Type.TAIL: + var subsubmap = submap.head_map ("two"); + var keyssubset = keys.head_set ("two"); + var entriessubset = entries.head_set (MapTests.entry_for ("two", "two")); + + assert (subsubmap.size == 2); + assert (keyssubset.size == 2); + assert (entriessubset.size == 2); + + subsubmap = submap.tail_map ("three"); + keyssubset = keys.tail_set ("three"); + entriessubset = entries.tail_set (MapTests.entry_for ("three", "three")); + + assert (subsubmap.size == 2); + assert (keyssubset.size == 2); + assert (entriessubset.size == 2); + + subsubmap = submap.sub_map ("three", "two"); + keyssubset = keys.sub_set ("three", "two"); + entriessubset = entries.sub_set (MapTests.entry_for ("three", "three"), MapTests.entry_for ("two", "two")); + + assert (subsubmap.size == 1); + assert (keyssubset.size == 1); + assert (entriessubset.size == 1); + break; + case Type.SUB: + var subsubmap = submap.head_map ("six"); + var keyssubset = keys.head_set ("six"); + var entriessubset = entries.head_set (MapTests.entry_for ("six", "six")); + + assert (subsubmap.size == 2); + assert (keyssubset.size == 2); + assert (entriessubset.size == 2); + + subsubmap = submap.tail_map ("one"); + keyssubset = keys.tail_set ("one"); + entriessubset = entries.tail_set (MapTests.entry_for ("one", "one")); + + assert (subsubmap.size == 2); + assert (keyssubset.size == 2); + assert (entriessubset.size == 2); + + subsubmap = submap.sub_map ("one", "six"); + keyssubset = keys.sub_set ("one", "six"); + entriessubset = entries.sub_set (MapTests.entry_for ("one", "one"), MapTests.entry_for ("six", "six")); + + assert (subsubmap.size == 1); + assert (keyssubset.size == 1); + assert (entriessubset.size == 1); + + subsubmap = submap.sub_map ("five", "two"); + keyssubset = keys.sub_set ("five", "two"); + entriessubset = entries.sub_set (MapTests.entry_for ("five", "five"), MapTests.entry_for ("two", "two")); + + assert (subsubmap.size == 3); + assert (keyssubset.size == 3); + assert (entriessubset.size == 3); + break; + case Type.EMPTY: + var subsubmap = submap.head_map ("six"); + var keyssubset = keys.head_set ("six"); + var entriessubset = entries.head_set (MapTests.entry_for ("six", "six")); + + assert (subsubmap.size == 0); + assert (keyssubset.size == 0); + assert (entriessubset.size == 0); + + subsubmap = submap.tail_map ("three"); + keyssubset = keys.tail_set ("three"); + entriessubset = entries.tail_set (MapTests.entry_for ("three", "three")); + + assert (subsubmap.size == 0); + assert (keyssubset.size == 0); + assert (entriessubset.size == 0); + + subsubmap = submap.sub_map ("one", "six"); + keyssubset = keys.sub_set ("one", "six"); + entriessubset = entries.sub_set (MapTests.entry_for ("one", "one"), MapTests.entry_for ("six", "six")); + + assert (subsubmap.size == 0); + assert (keyssubset.size == 0); + assert (entriessubset.size == 0); + break; + default: + assert_not_reached (); + } + } + } +} + |