From 75e738a9c9adb32517a2b0e743631bb40ff6dcb0 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 13 Dec 2009 12:30:49 -0500 Subject: [PATCH] Unit Tests - list.t - Added listIntersect and a Boolean listDiff implementation in main.h. - Added a set of unit tests for the above. --- src/main.h | 31 +++++++++++++ src/tests/.gitignore | 1 + src/tests/Makefile | 5 +- src/tests/list.t.cpp | 108 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 src/tests/list.t.cpp diff --git a/src/main.h b/src/main.h index 1d973f3d7..2c32bb35d 100644 --- a/src/main.h +++ b/src/main.h @@ -124,6 +124,19 @@ std::string colorizeDebug (const std::string&); int handleImport (std::string&); // list template +/////////////////////////////////////////////////////////////////////////////// +template bool listDiff (const T& left, const T& right) +{ + if (left.size () != right.size ()) + return true; + + for (unsigned int i = 0; i < left.size (); ++i) + if (left[i] != right[i]) + return true; + + return false; +} + /////////////////////////////////////////////////////////////////////////////// template void listDiff ( const T& left, const T& right, T& leftOnly, T& rightOnly) @@ -164,5 +177,23 @@ template void listDiff ( } } +//////////////////////////////////////////////////////////////////////////////// +template void listIntersect (const T& left, const T& right, T& join) +{ + join.clear (); + + for (unsigned int l = 0; l < left.size (); ++l) + { + for (unsigned int r = 0; r < right.size (); ++r) + { + if (left[l] == right[r]) + { + join.push_back (left[l]); + break; + } + } + } +} + #endif //////////////////////////////////////////////////////////////////////////////// diff --git a/src/tests/.gitignore b/src/tests/.gitignore index f74413eb3..75137c796 100644 --- a/src/tests/.gitignore +++ b/src/tests/.gitignore @@ -16,4 +16,5 @@ cmd.t config.t util.t color.t +list.t *.log diff --git a/src/tests/Makefile b/src/tests/Makefile index 66c973f37..b6fc01d2b 100644 --- a/src/tests/Makefile +++ b/src/tests/Makefile @@ -1,6 +1,6 @@ PROJECT = t.t tdb.t date.t duration.t t.benchmark.t text.t autocomplete.t \ config.t seq.t att.t stringtable.t record.t nibbler.t subst.t filt.t \ - cmd.t util.t color.t + cmd.t util.t color.t list.t CFLAGS = -I. -I.. -Wall -pedantic -ggdb3 -fno-rtti LFLAGS = -L/usr/local/lib -lncurses OBJECTS = ../TDB.o ../Task.o ../text.o ../Date.o ../Table.o ../Duration.o \ @@ -78,3 +78,6 @@ util.t: util.t.o $(OBJECTS) test.o color.t: color.t.o $(OBJECTS) test.o g++ color.t.o $(OBJECTS) test.o $(LFLAGS) -o color.t +list.t: list.t.o $(OBJECTS) test.o + g++ list.t.o $(OBJECTS) test.o $(LFLAGS) -o list.t + diff --git a/src/tests/list.t.cpp b/src/tests/list.t.cpp new file mode 100644 index 000000000..4313d6852 --- /dev/null +++ b/src/tests/list.t.cpp @@ -0,0 +1,108 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright 2008, Paul Beckingham. All rights reserved. +// +// +//////////////////////////////////////////////////////////////////////////////// +#include +#include "Context.h" +#include "main.h" +#include "test.h" + +Context context; + +//////////////////////////////////////////////////////////////////////////////// +int main (int argc, char** argv) +{ + UnitTest t (24); + + // 1,2,3 <=> 2,3,4 + std::vector string_one; + string_one.push_back ("1"); + string_one.push_back ("2"); + string_one.push_back ("3"); + + std::vector string_two; + string_two.push_back ("2"); + string_two.push_back ("3"); + string_two.push_back ("4"); + + std::vector string_three; + string_three.push_back ("2"); + string_three.push_back ("3"); + string_three.push_back ("4"); + + std::vector string_four; + + // Differences? + t.ok (!listDiff (string_one, string_one), "std::string (1,2,3) == (1,2,3)"); + t.ok (listDiff (string_one, string_two), "std::string (1,2,3) != (2,3,4)"); + t.ok (listDiff (string_one, string_three), "std::string (1,2,3) != (2,3,4)"); + t.ok (listDiff (string_one, string_four), "std::string (1,2,3) != ()"); + t.ok (!listDiff (string_four, string_four), "std::string () == ()"); + + // What are the differences? + std::vector string_leftOnly; + std::vector string_rightOnly; + listDiff (string_one, string_two, string_leftOnly, string_rightOnly); + t.is ((int) string_leftOnly.size (), 1, "std::string (1,2,3) <=> (2,3,4) = 1<-"); + t.is (string_leftOnly[0], "1", "std::string (1,2,3) <=> (2,3,4) = 1<-"); + + t.is ((int) string_rightOnly.size (), 1, "std::string (1,2,3) <=> (2,3,4) = ->4"); + t.is (string_rightOnly[0], "4", "std::string (1,2,3) <=> (2,3,4) = ->4"); + + // What is the intersection? + std::vector string_join; + listIntersect (string_one, string_two, string_join); + t.is ((int) string_join.size (), 2, "std::string (1,2,3) intersect (2,3,4) = (2,3)"); + t.is (string_join[0], "2", "std::string (1,2,3) intersect (2,3,4) = (2,3)"); + t.is (string_join[1], "3", "std::string (1,2,3) intersect (2,3,4) = (2,3)"); + + // Now do it all again, with integers. + + // 1,2,3 <=> 2,3,4 + std::vector int_one; + int_one.push_back (1); + int_one.push_back (2); + int_one.push_back (3); + + std::vector int_two; + int_two.push_back (2); + int_two.push_back (3); + int_two.push_back (4); + + std::vector int_three; + int_three.push_back (2); + int_three.push_back (3); + int_three.push_back (4); + + std::vector int_four; + + // Differences? + t.ok (!listDiff (int_one, int_one), "int (1,2,3) == (1,2,3)"); + t.ok (listDiff (int_one, int_two), "int (1,2,3) != (2,3,4)"); + t.ok (listDiff (int_one, int_three), "int (1,2,3) != (2,3,4)"); + t.ok (listDiff (int_one, int_four), "int (1,2,3) != ()"); + t.ok (!listDiff (int_four, int_four), "int () == ()"); + + // What are the differences? + std::vector int_leftOnly; + std::vector int_rightOnly; + listDiff (int_one, int_two, int_leftOnly, int_rightOnly); + t.is ((int) int_leftOnly.size (), 1, "int (1,2,3) <=> (2,3,4) = 1<-"); + t.is (int_leftOnly[0], "1", "int (1,2,3) <=> (2,3,4) = 1<-"); + + t.is ((int) int_rightOnly.size (), 1, "int (1,2,3) <=> (2,3,4) = ->4"); + t.is (int_rightOnly[0], "4", "int (1,2,3) <=> (2,3,4) = ->4"); + + // What is the intersection? + std::vector int_join; + listIntersect (int_one, int_two, int_join); + t.is ((int) int_join.size (), 2, "int (1,2,3) intersect (2,3,4) = (2,3)"); + t.is (int_join[0], "2", "int (1,2,3) intersect (2,3,4) = (2,3)"); + t.is (int_join[1], "3", "int (1,2,3) intersect (2,3,4) = (2,3)"); + + return 0; +} + +//////////////////////////////////////////////////////////////////////////////// +