summaryrefslogtreecommitdiff
path: root/tikzit-1/src/common/test
diff options
context:
space:
mode:
Diffstat (limited to 'tikzit-1/src/common/test')
-rw-r--r--tikzit-1/src/common/test/Makefile14
-rw-r--r--tikzit-1/src/common/test/color.m80
-rw-r--r--tikzit-1/src/common/test/common.m34
-rw-r--r--tikzit-1/src/common/test/maths.m562
-rw-r--r--tikzit-1/src/common/test/parser.m86
-rw-r--r--tikzit-1/src/common/test/test.h57
-rw-r--r--tikzit-1/src/common/test/test.m175
7 files changed, 1008 insertions, 0 deletions
diff --git a/tikzit-1/src/common/test/Makefile b/tikzit-1/src/common/test/Makefile
new file mode 100644
index 0000000..d158d16
--- /dev/null
+++ b/tikzit-1/src/common/test/Makefile
@@ -0,0 +1,14 @@
+OBJC = gcc -MMD -MP -DSTAND_ALONE -DGNUSTEP -DGNUSTEP_BASE_LIBRARY=1 -DGNU_RUNTIME=1 -DGNUSTEP_BASE_LIBRARY=1 -fno-strict-aliasing -fPIC -Wall -DGSWARN -DGSDIAGNOSE -Wno-import -O0 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fgnu-runtime -fconstant-string-class=NSConstantString -I. -I.. -I/users/alemer/GNUstep/Library/Headers -std=c99 -D_GNU_SOURCE -rdynamic -fgnu-runtime -L/users/alemer/GNUstep/Library/Libraries -L/usr/local/lib64 -L/usr/lib64 -lgnustep-base -lpthread -lobjc -lm
+
+maths_test_objects = test.m maths.m ../util.m
+color_test_objects = test.m color.m ../ColorRGB.m ../util.m ../BasicMapTable.m ../RColor.m
+
+test: maths-test color-test
+ ./maths-test
+ ./color-test
+
+maths-test: $(maths_test_objects)
+ $(OBJC) $(maths_test_objects) -o $@
+
+color-test: $(color_test_objects)
+ $(OBJC) $(color_test_objects) -o $@
diff --git a/tikzit-1/src/common/test/color.m b/tikzit-1/src/common/test/color.m
new file mode 100644
index 0000000..48a6ff4
--- /dev/null
+++ b/tikzit-1/src/common/test/color.m
@@ -0,0 +1,80 @@
+//
+// color.m
+// TikZiT
+//
+// Copyright 2010 Aleks Kissinger. All rights reserved.
+//
+//
+// This file is part of TikZiT.
+//
+// TikZiT is free software: you can redistribute it and/or modify
+// 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.
+//
+// TikZiT 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 TikZiT. If not, see <http://www.gnu.org/licenses/>.
+//
+#import "test/test.h"
+#import "ColorRGB.h"
+
+#ifdef STAND_ALONE
+void runTests() {
+#else
+void testColor() {
+#endif
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ startTestBlock(@"color");
+
+ ColorRGB *red = [ColorRGB colorWithRed:255 green:0 blue:0];
+ ColorRGB *lime = [ColorRGB colorWithRed:0 green:255 blue:0];
+ ColorRGB *green = [ColorRGB colorWithRed:0 green:128 blue:0];
+ TEST(@"Recognised red",
+ [red name] != nil &&
+ [[red name] isEqualToString:@"Red"]);
+ TEST(@"Recognised lime",
+ [lime name] != nil &&
+ [[lime name] isEqualToString:@"Lime"]);
+ TEST(@"Recognised green",
+ [green name] != nil &&
+ [[green name] isEqualToString:@"Green"]);
+
+ ColorRGB *floatRed = [ColorRGB colorWithFloatRed:1.0f green:0.0f blue:0.0f];
+ ColorRGB *floatLime = [ColorRGB colorWithFloatRed:0.0f green:1.0f blue:0.0f];
+ ColorRGB *floatGreen = [ColorRGB colorWithFloatRed:0.0f green:0.5f blue:0.0f];
+
+ TEST(@"Float red equal to int red", [floatRed isEqual:red]);
+ TEST(@"Float lime equal to int lime", [floatLime isEqual:lime]);
+ TEST(@"Float green equal to int green", [floatGreen isEqual:green]);
+
+ TEST(@"Recognised float red",
+ [floatRed name] != nil &&
+ [[floatRed name] isEqualToString:@"Red"]);
+
+ TEST(@"Recognised float lime",
+ [floatLime name] != nil &&
+ [[floatLime name] isEqualToString:@"Lime"]);
+
+ TEST(@"Recognised float green",
+ [floatGreen name] != nil &&
+ [[floatGreen name] isEqualToString:@"Green"]);
+
+ [floatRed setRedFloat:0.99f];
+ TEST(@"Nudged red, not recognised now", [floatRed name] == nil);
+ [floatRed setToClosestHashed];
+ TEST(@"Set to closest hashed, reconised again",
+ [floatRed name] != nil &&
+ [[floatRed name] isEqualToString:@"Red"]);
+
+ TEST(@"Red has correct hex (ff0000)", [[red hexName] isEqualToString:@"hexcolor0xff0000"]);
+ TEST(@"Lime has correct hex (00ff00)", [[lime hexName] isEqualToString:@"hexcolor0x00ff00"]);
+ TEST(@"Green has correct hex (008000)", [[green hexName] isEqualToString:@"hexcolor0x008000"]);
+
+ endTestBlock(@"color");
+ [pool drain];
+}
diff --git a/tikzit-1/src/common/test/common.m b/tikzit-1/src/common/test/common.m
new file mode 100644
index 0000000..c9ac980
--- /dev/null
+++ b/tikzit-1/src/common/test/common.m
@@ -0,0 +1,34 @@
+//
+// common.m
+// TikZiT
+//
+// Copyright 2010 Aleks Kissinger. All rights reserved.
+//
+//
+// This file is part of TikZiT.
+//
+// TikZiT is free software: you can redistribute it and/or modify
+// 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.
+//
+// TikZiT 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 TikZiT. If not, see <http://www.gnu.org/licenses/>.
+//
+#import "test/test.h"
+void testParser();
+void testColor();
+void testMaths();
+
+void testCommon() {
+ startTestBlock(@"common");
+ testParser();
+ testColor();
+ testMaths();
+ endTestBlock(@"common");
+}
diff --git a/tikzit-1/src/common/test/maths.m b/tikzit-1/src/common/test/maths.m
new file mode 100644
index 0000000..a11e58e
--- /dev/null
+++ b/tikzit-1/src/common/test/maths.m
@@ -0,0 +1,562 @@
+//
+// TikZiT
+//
+// Copyright 2011 Alex Merry
+//
+// This file is part of TikZiT.
+//
+// TikZiT is free software: you can redistribute it and/or modify
+// 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.
+//
+// TikZiT 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 TikZiT. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#import "../util.h"
+
+#import "test.h"
+
+void testRectAroundPoints() {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ startTestBlock(@"NSRectAroundPoints");
+
+ NSRect rect = NSRectAroundPoints (NSZeroPoint, NSZeroPoint);
+ assertRectsEqual (@"(0,0) and (0,0)", rect, NSZeroRect);
+
+ rect = NSRectAroundPoints (NSZeroPoint, NSMakePoint (1.0f, 1.0f));
+ assertRectsEqual (@"(0,0) and (1,1)", rect, NSMakeRect (0.0f, 0.0f, 1.0f, 1.0f));
+
+ rect = NSRectAroundPoints (NSMakePoint (-1.0f, 1.0f), NSMakePoint (1.0f, -1.0f));
+ assertRectsEqual (@"(-1,1) and (1,-1)", rect, NSMakeRect (-1.0f, -1.0f, 2.0f, 2.0f));
+
+ endTestBlock(@"NSRectAroundPoints");
+ [pool drain];
+}
+
+void testRectAroundPointsWithPadding() {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ startTestBlock(@"NSRectAroundPointsWithPadding");
+
+ NSRect rect = NSRectAroundPointsWithPadding (NSZeroPoint, NSZeroPoint, 0.0f);
+ assertRectsEqual (@"(0,0) and (0,0); 0 padding", rect, NSZeroRect);
+
+ rect = NSRectAroundPointsWithPadding (NSZeroPoint, NSZeroPoint, 0.2f);
+ assertRectsEqual (@"(0,0) and (0,0); 0.2 padding", rect, NSMakeRect (-0.2f, -0.2f, 0.4f, 0.4f));
+
+ rect = NSRectAroundPointsWithPadding (NSZeroPoint, NSMakePoint (1.0f, 1.0f), -0.2f);
+ assertRectsEqual (@"(0,0) and (1,1); -0.2 padding", rect, NSMakeRect (0.2f, 0.2f, 0.6f, 0.6f));
+
+ endTestBlock(@"NSRectAroundPointsWithPadding");
+ [pool drain];
+}
+
+void testGoodAtan() {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ startTestBlock(@"good_atan");
+
+ assertFloatsEqual (@"0.0, 0.0", good_atan (0.0f, 0.0f), 0.0f);
+ assertFloatsEqual (@"0.0, 1.0", good_atan (0.0f, 1.0f), 0.5f * M_PI);
+ assertFloatsEqual (@"0.0, -1.0", good_atan (0.0f, -1.0f), 1.5f * M_PI);
+ assertFloatsEqual (@"1.0, 0.0", good_atan (1.0f, 0.0f), 0.0f);
+ assertFloatsEqual (@"1.0, 0.1", good_atan (1.0f, 0.1f), 0.0996687f);
+
+ endTestBlock(@"good_atan");
+ [pool drain];
+}
+
+void testBezierInterpolate() {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ startTestBlock(@"bezierInterpolate");
+
+ assertFloatsEqual (@"0.0, (0.0, 0.1, 0.2, 0.3)", bezierInterpolate (0.0f, 0.0f, 0.1f, 0.2f, 0.3f), 0.0f);
+ assertFloatsEqual (@"1.0, (0.0, 0.1, 0.2, 0.3)", bezierInterpolate (1.0f, 0.0f, 0.1f, 0.2f, 0.3f), 0.3f);
+ assertFloatsEqual (@"0.5, (0.0, 0.1, 0.2, 0.3)", bezierInterpolate (0.5f, 0.0f, 0.1f, 0.2f, 0.3f), 0.15f);
+ // FIXME: other tests
+
+ endTestBlock(@"bezierInterpolate");
+ [pool drain];
+}
+
+void testLineSegmentsIntersect() {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ startTestBlock(@"lineSegmentsIntersect");
+
+ BOOL result = NO;
+ NSPoint intersection = NSMakePoint (-1.0f, -1.0f);
+
+ result = lineSegmentsIntersect (NSMakePoint (-1.0f, -1.0f), NSMakePoint (1.0f, 1.0f),
+ NSMakePoint (-1.0f, 1.0f), NSMakePoint (1.0f, -1.0f),
+ &intersection);
+ TEST (@"Cross at zero: has intersection", result);
+ assertPointsEqual (@"Cross at zero: intersection value", intersection, NSZeroPoint);
+
+ result = lineSegmentsIntersect (NSMakePoint (-1.0f, -1.0f), NSMakePoint (-0.5f, -0.5f),
+ NSMakePoint (-1.0f, 1.0f), NSMakePoint (1.0f, -1.0f),
+ &intersection);
+ TEST (@"Fail to cross at zero", !result);
+
+ result = lineSegmentsIntersect (NSMakePoint (1.0f, 1.0f), NSMakePoint (1.0f, -1.0f),
+ NSMakePoint (0.0f, 0.0f), NSMakePoint (1.0f, 0.0f),
+ &intersection);
+ TEST (@"Touch at one: has intersection", result);
+ assertPointsEqual (@"Touch at one: intersection value", intersection, NSMakePoint (1.0f, 0.0f));
+
+ endTestBlock(@"lineSegmentsIntersect");
+ [pool drain];
+}
+
+void testLineSegmentIntersectsRect() {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ startTestBlock(@"lineSegmentIntersectsRect");
+
+ BOOL result = NO;
+
+ result = lineSegmentIntersectsRect (
+ NSMakePoint (-1.0f, -1.0f),
+ NSMakePoint (0.0f, 0.0f),
+ NSZeroRect);
+ TEST (@"Zero rect; line touches zero", result);
+
+ result = lineSegmentIntersectsRect (
+ NSMakePoint (-1.0f, -1.0f),
+ NSMakePoint (-0.1f, -0.1f),
+ NSZeroRect);
+ TEST (@"Zero rect; line short of zero", !result);
+
+ NSRect rect = NSMakeRect (1.0f, 1.0f, 1.0f, 1.0f);
+
+ result = lineSegmentIntersectsRect (
+ NSMakePoint (0.0f, 0.0f),
+ NSMakePoint (3.0f, 1.0f),
+ rect);
+ TEST (@"Line underneath", !result);
+
+ result = lineSegmentIntersectsRect (
+ NSMakePoint (0.0f, 0.0f),
+ NSMakePoint (1.0f, 3.0f),
+ rect);
+ TEST (@"Line to left", !result);
+
+ result = lineSegmentIntersectsRect (
+ NSMakePoint (0.0f, 2.0f),
+ NSMakePoint (3.0f, 3.0f),
+ rect);
+ TEST (@"Line above", !result);
+
+ result = lineSegmentIntersectsRect (
+ NSMakePoint (2.0f, 0.0f),
+ NSMakePoint (3.0f, 3.0f),
+ rect);
+ TEST (@"Line to right", !result);
+
+ result = lineSegmentIntersectsRect (
+ NSMakePoint (0.0f, 0.0f),
+ NSMakePoint (0.9f, 0.9f),
+ rect);
+ TEST (@"Line short", !result);
+
+ result = lineSegmentIntersectsRect (
+ NSMakePoint (1.1f, 1.1f),
+ NSMakePoint (1.9f, 1.9f),
+ rect);
+ TEST (@"Line inside", result);
+
+ result = lineSegmentIntersectsRect (
+ NSMakePoint (0.0f, 1.5f),
+ NSMakePoint (3.0f, 1.5f),
+ rect);
+ TEST (@"Horizontal line through", result);
+
+ result = lineSegmentIntersectsRect (
+ NSMakePoint (1.5f, 0.0f),
+ NSMakePoint (1.5f, 3.0f),
+ rect);
+ TEST (@"Vertical line through", result);
+
+ result = lineSegmentIntersectsRect (
+ NSMakePoint (0.5f, 1.0f),
+ NSMakePoint (2.0f, 2.5f),
+ rect);
+ TEST (@"Cut top and left", result);
+
+ result = lineSegmentIntersectsRect (
+ NSMakePoint (2.0f, 0.5f),
+ NSMakePoint (0.5f, 2.0f),
+ rect);
+ TEST (@"Cut bottom and left", result);
+
+ result = lineSegmentIntersectsRect (
+ NSMakePoint (1.0f, 0.5f),
+ NSMakePoint (2.5f, 2.0f),
+ rect);
+ TEST (@"Cut bottom and right", result);
+
+ result = lineSegmentIntersectsRect (
+ NSMakePoint (0.0f, 1.0f),
+ NSMakePoint (2.0f, 3.0f),
+ rect);
+ TEST (@"Touch top left", result);
+
+ result = lineSegmentIntersectsRect (
+ NSMakePoint (1.0f, 0.0f),
+ NSMakePoint (3.0f, 2.0f),
+ rect);
+ TEST (@"Touch bottom right", result);
+
+ result = lineSegmentIntersectsRect (
+ NSMakePoint (1.0f, 0.0f),
+ NSMakePoint (1.0f, 3.0f),
+ rect);
+ TEST (@"Along left side", result);
+
+ result = lineSegmentIntersectsRect (
+ NSMakePoint (0.0f, 1.0f),
+ NSMakePoint (3.0f, 1.0f),
+ rect);
+ TEST (@"Along bottom side", result);
+
+ endTestBlock(@"lineSegmentIntersectsRect");
+ [pool drain];
+}
+
+struct line_bezier_test {
+ NSString *msg;
+ NSPoint lstart;
+ NSPoint lend;
+ NSPoint c0;
+ NSPoint c1;
+ NSPoint c2;
+ NSPoint c3;
+ BOOL expectedResult;
+ float expectedT;
+ NSPoint expectedIntersect;
+};
+
+static struct line_bezier_test line_bezier_tests[] = {
+ {
+ @"Outside box",
+ {0.0f, 0.0f},
+ {1.0f, 0.0f},
+ {0.0f, 1.0f},
+ {0.0f, 2.0f},
+ {1.0f, 2.0f},
+ {1.0f, 1.0f},
+ NO,
+ -1.0f,
+ {0.0f, 0.0f}
+ },
+ {
+ @"Single intersect",
+ {100.0f, 20.0f},
+ {195.0f, 255.0f},
+ {93.0f, 163.0f},
+ {40.0f, 30.0f},
+ {270.0f, 115.0f},
+ {219.0f, 178.0f},
+ YES,
+ -0.4f,
+ {129.391693f, 92.705772f}
+ },
+ {
+ @"Double intersect",
+ {100.0f, 20.0f},
+ {195.0f, 255.0f},
+ {93.0f, 163.0f},
+ {40.0f, 30.0f},
+ {270.0f, 115.0f},
+ {154.0f, 212.0f},
+ YES,
+ -0.909f,
+ {170.740646f,194.990021f}
+ },
+ {
+ @"Near miss",
+ {100.0f, 20.0f},
+ {195.0f, 255.0f},
+ {93.0f, 163.0f},
+ {40.0f, 30.0f},
+ {176.0f, 100.0f},
+ {154.0f, 212.0f},
+ NO,
+ -1.0f,
+ {0.0f,0.0f}
+ }
+};
+static unsigned int n_line_bezier_tests = sizeof (line_bezier_tests) / sizeof (line_bezier_tests[0]);
+
+void testLineSegmentIntersectsBezier() {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ startTestBlock(@"lineSegmentIntersectsBezier");
+
+ for (unsigned int i = 0; i < n_line_bezier_tests; ++i) {
+ NSPoint intersect;
+ BOOL result = lineSegmentIntersectsBezier (
+ line_bezier_tests[i].lstart,
+ line_bezier_tests[i].lend,
+ line_bezier_tests[i].c0,
+ line_bezier_tests[i].c1,
+ line_bezier_tests[i].c2,
+ line_bezier_tests[i].c3,
+ &intersect);
+ if (result) {
+ if (line_bezier_tests[i].expectedT < 0.0f) {
+ assertPointsEqual (line_bezier_tests[i].msg, intersect, line_bezier_tests[i].expectedIntersect);
+ } else {
+ assertPointsEqual (line_bezier_tests[i].msg, intersect,
+ bezierInterpolateFull (line_bezier_tests[i].expectedT, line_bezier_tests[i].c0, line_bezier_tests[i].c1, line_bezier_tests[i].c2, line_bezier_tests[i].c3));
+ }
+ } else {
+ if (line_bezier_tests[i].expectedResult)
+ fail (line_bezier_tests[i].msg);
+ else
+ pass (line_bezier_tests[i].msg);
+ }
+ }
+
+BOOL lineSegmentIntersectsBezier (NSPoint lstart, NSPoint lend, NSPoint c0, NSPoint c1, NSPoint c2, NSPoint c3, NSPoint *result);
+ endTestBlock(@"lineSegmentIntersectsBezier");
+ [pool drain];
+}
+
+struct exit_point_test {
+ NSString *msg;
+ NSPoint rayStart;
+ float angle;
+ NSRect rect;
+ NSPoint expected;
+};
+
+static struct exit_point_test exit_point_tests[] = {
+ {
+ @"0.0 rads",
+ {0.0f, 0.0f},
+ 0.0f,
+ {{-1.0f, -1.0f}, {2.0f, 2.0f}},
+ {1.0f, 0.0f}
+ },
+ {
+ @"pi/2 rads",
+ {0.0f, 0.0f},
+ M_PI / 2.0f,
+ {{-1.0f, -1.0f}, {2.0f, 2.0f}},
+ {0.0f, 1.0f}
+ },
+ {
+ @"-pi/2 rads",
+ {0.0f, 0.0f},
+ -M_PI / 2.0f,
+ {{-1.0f, -1.0f}, {2.0f, 2.0f}},
+ {0.0f, -1.0f}
+ },
+ {
+ @"pi rads",
+ {0.0f, 0.0f},
+ M_PI,
+ {{-1.0f, -1.0f}, {2.0f, 2.0f}},
+ {-1.0f, 0.0f}
+ },
+ {
+ @"-pi rads",
+ {0.0f, 0.0f},
+ -M_PI,
+ {{-1.0f, -1.0f}, {2.0f, 2.0f}},
+ {-1.0f, 0.0f}
+ },
+ {
+ @"pi/4 rads",
+ {0.0f, 0.0f},
+ M_PI / 4.0f,
+ {{-1.0f, -1.0f}, {2.0f, 2.0f}},
+ {1.0f, 1.0f}
+ },
+ {
+ @"3pi/4 rads",
+ {0.0f, 0.0f},
+ (3.0f * M_PI) / 4.0f,
+ {{-1.0f, -1.0f}, {2.0f, 2.0f}},
+ {-1.0f, 1.0f}
+ },
+ {
+ @"-pi/4 rads",
+ {0.0f, 0.0f},
+ -M_PI / 4.0f,
+ {{-1.0f, -1.0f}, {2.0f, 2.0f}},
+ {1.0f, -1.0f}
+ },
+ {
+ @"-3pi/4 rads",
+ {0.0f, 0.0f},
+ (-3.0f * M_PI) / 4.0f,
+ {{-1.0f, -1.0f}, {2.0f, 2.0f}},
+ {-1.0f, -1.0f}
+ },
+ {
+ @"pi/8 rads",
+ {0.0f, 0.0f},
+ M_PI / 8.0f,
+ {{-1.0f, -1.0f}, {2.0f, 2.0f}},
+ {1.0f, 0.414213562373095f}
+ },
+ {
+ @"3pi/8 rads",
+ {0.0f, 0.0f},
+ 3.0f * M_PI / 8.0f,
+ {{-1.0f, -1.0f}, {2.0f, 2.0f}},
+ {0.414213562373095f, 1.0f}
+ },
+ {
+ @"-5pi/8 rads",
+ {0.0f, 0.0f},
+ -5.0f * M_PI / 8.0f,
+ {{-1.0f, -1.0f}, {2.0f, 2.0f}},
+ {-0.414213562373095f, -1.0f}
+ },
+ {
+ @"-7pi/8 rads",
+ {0.0f, 0.0f},
+ -7.0f * M_PI / 8.0f,
+ {{-1.0f, -1.0f}, {2.0f, 2.0f}},
+ {-1.0f, -0.414213562373095f}
+ },
+ {
+ @"pi/8 rads; origin (1,1)",
+ {1.0f, 1.0f},
+ M_PI / 8.0f,
+ {{0.0f, 0.0f}, {2.0f, 2.0f}},
+ {2.0f, 1.414213562373095f}
+ },
+ {
+ @"7pi/8 rads; origin (-2,2)",
+ {-2.0f, 2.0f},
+ 7.0f * M_PI / 8.0f,
+ {{-3.0f, 1.0f}, {2.0f, 2.0f}},
+ {-3.0f, 2.414213562373095f}
+ },
+ {
+ @"pi/8 rads; origin (1,1); SW of box",
+ {1.0f, 1.0f},
+ M_PI / 8.0f,
+ {{1.0f, 1.0f}, {1.0f, 1.0f}},
+ {2.0f, 1.414213562373095f}
+ },
+ {
+ @"pi/8 rads; origin (1,1); SE of box",
+ {1.0f, 1.0f},
+ M_PI / 8.0f,
+ {{0.0f, 1.0f}, {1.0f, 1.0f}},
+ {1.0f, 1.0f}
+ },
+ {
+ @"pi/8 rads; origin (1,1); NE of box",
+ {1.0f, 1.0f},
+ M_PI / 8.0f,
+ {{0.0f, 1.0f}, {1.0f, 1.0f}},
+ {1.0f, 1.0f}
+ },
+ {
+ @"pi/8 rads; origin (1,1); NW of box",
+ {1.0f, 1.0f},
+ M_PI / 8.0f,
+ {{1.0f, 0.0f}, {1.0f, 1.0f}},
+ {1.0f, 1.0f}
+ },
+ {
+ @"pi/8 rads; origin (1,1); N of box",
+ {1.0f, 1.0f},
+ M_PI / 8.0f,
+ {{0.5f, 0.0f}, {1.0f, 1.0f}},
+ {1.0f, 1.0f}
+ },
+ {
+ @"7pi/8 rads; origin (1,1); N of box",
+ {1.0f, 1.0f},
+ 7.0f * M_PI / 8.0f,
+ {{0.5f, 0.0f}, {1.0f, 1.0f}},
+ {1.0f, 1.0f}
+ },
+ {
+ @"-pi/8 rads; origin (1,1); S of box",
+ {1.0f, 1.0f},
+ -M_PI / 8.0f,
+ {{0.5f, 1.0f}, {1.0f, 1.0f}},
+ {1.0f, 1.0f}
+ },
+ {
+ @"-pi/8 rads; origin (1,1); E of box",
+ {1.0f, 1.0f},
+ -M_PI / 8.0f,
+ {{0.0f, 0.5f}, {1.0f, 1.0f}},
+ {1.0f, 1.0f}
+ },
+ {
+ @"-7pi/8 rads; origin (1,1); W of box",
+ {1.0f, 1.0f},
+ -7.0f * M_PI / 8.0f,
+ {{1.0f, 0.5f}, {1.0f, 1.0f}},
+ {1.0f, 1.0f}
+ },
+ {
+ @"7pi/8 rads; origin (1,1); W of box",
+ {1.0f, 1.0f},
+ 7.0f * M_PI / 8.0f,
+ {{1.0f, 0.5f}, {1.0f, 1.0f}},
+ {1.0f, 1.0f}
+ },
+ {
+ @"pi/8 rads; origin (1,1); leave through top",
+ {1.0f, 1.0f},
+ M_PI / 8.0f,
+ {{0.9f, 0.1f}, {1.0f, 1.0f}},
+ {1.2414213562373f, 1.1f}
+ },
+ {
+ @"0 rads; origin (1,1); N of box",
+ {1.0f, 1.0f},
+ 0.0f,
+ {{0.5f, 0.0f}, {1.0f, 1.0f}},
+ {1.5f, 1.0f}
+ }
+};
+static unsigned int n_exit_point_tests = sizeof (exit_point_tests) / sizeof (exit_point_tests[0]);
+
+void testFindExitPointOfRay() {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ startTestBlock(@"findExitPointOfRay");
+
+ for (unsigned int i = 0; i < n_exit_point_tests; ++i) {
+ NSPoint exitPoint = findExitPointOfRay (
+ exit_point_tests[i].rayStart,
+ exit_point_tests[i].angle,
+ exit_point_tests[i].rect);
+ assertPointsEqual (exit_point_tests[i].msg, exitPoint, exit_point_tests[i].expected);
+ }
+
+ endTestBlock(@"findExitPointOfRay");
+ [pool drain];
+}
+
+#ifdef STAND_ALONE
+void runTests() {
+#else
+void testMaths() {
+#endif
+ startTestBlock(@"maths");
+ testRectAroundPoints();
+ testRectAroundPointsWithPadding();
+ testGoodAtan();
+ testBezierInterpolate();
+ testLineSegmentsIntersect();
+ testLineSegmentIntersectsRect();
+ testFindExitPointOfRay();
+ testLineSegmentIntersectsBezier();
+ endTestBlock(@"maths");
+}
+
+// vim:ft=objc:ts=4:sts=4:sw=4:noet
diff --git a/tikzit-1/src/common/test/parser.m b/tikzit-1/src/common/test/parser.m
new file mode 100644
index 0000000..3346acd
--- /dev/null
+++ b/tikzit-1/src/common/test/parser.m
@@ -0,0 +1,86 @@
+//
+// parser.m
+// TikZiT
+//
+// Copyright 2010 Aleks Kissinger. All rights reserved.
+//
+//
+// This file is part of TikZiT.
+//
+// TikZiT is free software: you can redistribute it and/or modify
+// 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.
+//
+// TikZiT 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 TikZiT. If not, see <http://www.gnu.org/licenses/>.
+//
+#import "test/test.h"
+#import "TikzGraphAssembler.h"
+
+
+#ifdef STAND_ALONE
+void runTests() {
+#else
+void testParser() {
+#endif
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ startTestBlock(@"parser");
+
+ [TikzGraphAssembler setup];
+
+ NodeStyle *rn = [NodeStyle defaultNodeStyleWithName:@"rn"];
+ NSArray *styles = [NSArray arrayWithObject:rn];
+
+ NSString *tikz =
+ @"\\begin{tikzpicture}[dotpic]"
+ @" \\begin{pgfonlayer}{foo}" //ignored
+ @" \\node [style=rn] (0) at (-2,3.4) {stuff{$\\alpha$ in here}};"
+ @" \\node (b) at (1,1) {};"
+ @" \\end{pgfonlayer}" //ignored
+ @" \\draw [bend right=20] (0) to node[tick]{-} (b.center);"
+ @"\\end{tikzpicture}";
+
+ TikzGraphAssembler *ga = [[TikzGraphAssembler alloc] init];
+ TEST(@"Parsing TikZ", [ga parseTikz:tikz]);
+
+ Graph *g = [ga graph];
+ TEST(@"Graph is non-nil", g != nil);
+ TEST(@"Graph has correct number of nodes", [[g nodes] count]==2);
+ TEST(@"Graph has correct number of edges", [[g edges] count]==1);
+
+ NSEnumerator *en = [[g nodes] objectEnumerator];
+ Node *n;
+ Node *n1, *n2;
+ while ((n=[en nextObject])) {
+ [n attachStyleFromTable:styles];
+ if ([n style] == rn) n1 = n;
+ else if ([n style] == nil) n2 = n;
+ }
+
+ TEST(@"Styles attached correctly", n1!=nil && n2!=nil);
+
+ TEST(@"Nodes labeled correctly",
+ [[n1 label] isEqualToString:@"stuff{$\\alpha$ in here}"] &&
+ [[n2 label] isEqualToString:@""]
+ );
+
+ Edge *e1 = [[[g edges] objectEnumerator] nextObject];
+
+ TEST(@"Edge has edge node", [e1 edgeNode]!=nil);
+ TEST(@"Edge node labeled correctly", [[[e1 edgeNode] label] isEqualToString:@"-"]);
+// NSString *sty = [[[[[e1 edgeNode] data] atoms] objectEnumerator] nextObject];
+// TEST(@"Edge node styled correctly", sty!=nil && [sty isEqualToString:@"tick"]);
+
+ PUTS(@"Source anchor: %@",[e1 sourceAnchor]);
+ PUTS(@"Target anchor: %@",[e1 targetAnchor]);
+
+ endTestBlock(@"parser");
+
+ [pool drain];
+}
diff --git a/tikzit-1/src/common/test/test.h b/tikzit-1/src/common/test/test.h
new file mode 100644
index 0000000..59dcdd4
--- /dev/null
+++ b/tikzit-1/src/common/test/test.h
@@ -0,0 +1,57 @@
+//
+// test.h
+// TikZiT
+//
+// Copyright 2010 Aleks Kissinger. All rights reserved.
+//
+//
+// This file is part of TikZiT.
+//
+// TikZiT is free software: you can redistribute it and/or modify
+// 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.
+//
+// TikZiT 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 TikZiT. If not, see <http://www.gnu.org/licenses/>.
+//
+#import <Foundation/Foundation.h>
+
+@interface Allocator : NSObject
+{}
+@end
+
+BOOL fuzzyCompare (float f1, float f2);
+BOOL fuzzyComparePoints (NSPoint p1, NSPoint p2);
+
+void setColorEnabled(BOOL b);
+
+void pass(NSString *msg);
+void fail(NSString *msg);
+void TEST(NSString *msg, BOOL test);
+void assertRectsEqual (NSString *msg, NSRect val, NSRect exp);
+void assertPointsEqual (NSString *msg, NSPoint val, NSPoint exp);
+void assertFloatsEqual (NSString *msg, float val, float exp);
+
+void startTests();
+void endTests();
+
+void startTestBlock(NSString *name);
+void endTestBlock(NSString *name);
+
+#define PUTS(fmt, ...) { \
+ NSString *_str = [[NSString alloc] initWithFormat:fmt, ##__VA_ARGS__]; \
+ printf("%s\n", [_str UTF8String]); \
+ [_str release]; }
+
+#define failFmt(fmt, ...) { \
+ NSString *_fstr = [[NSString alloc] initWithFormat:fmt, ##__VA_ARGS__]; \
+ fail(_fstr); \
+ [_fstr release]; }
+
+// vim:ft=objc:ts=4:sts=4:sw=4:noet
diff --git a/tikzit-1/src/common/test/test.m b/tikzit-1/src/common/test/test.m
new file mode 100644
index 0000000..9afcd67
--- /dev/null
+++ b/tikzit-1/src/common/test/test.m
@@ -0,0 +1,175 @@
+//
+// test.m
+// TikZiT
+//
+// Copyright 2010 Aleks Kissinger. All rights reserved.
+//
+//
+// This file is part of TikZiT.
+//
+// TikZiT is free software: you can redistribute it and/or modify
+// 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.
+//
+// TikZiT 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 TikZiT. If not, see <http://www.gnu.org/licenses/>.
+//
+#import "test/test.h"
+
+static int PASSES;
+static int FAILS;
+
+static int ALLOC_INSTANCES = 0;
+
+static BOOL colorEnabled = YES;
+static int depth = 0;
+
+static NSString *RED, *GREEN, *BLUE, *OFF;
+
+static NSString *indents[6] =
+ {@"", @" ", @" ", @" ",
+ @" ", @" "};
+
+#define INDENT ((depth >= 6) ? indents[5] : indents[depth])
+
+
+@implementation Allocator
+
++ (id)alloc {
+ ++ALLOC_INSTANCES;
+ return [super alloc];
+}
+
+- (void)dealloc {
+ --ALLOC_INSTANCES;
+ [super dealloc];
+}
+
++ (Allocator*)allocator {
+ return [[[Allocator alloc] init] autorelease];
+}
+
+@end
+
+BOOL fuzzyCompare(float f1, float f2) {
+ return (ABS(f1 - f2) <= 0.00001f * MAX(1.0f,MIN(ABS(f1), ABS(f2))));
+}
+
+BOOL fuzzyComparePoints (NSPoint p1, NSPoint p2) {
+ return fuzzyCompare (p1.x, p2.x) && fuzzyCompare (p1.y, p2.y);
+}
+
+void pass(NSString *msg) {
+ PUTS(@"%@[%@PASS%@] %@", INDENT, GREEN, OFF, msg);
+ ++PASSES;
+}
+
+void fail(NSString *msg) {
+ PUTS(@"%@[%@FAIL%@] %@", INDENT, RED, OFF, msg);
+ ++FAILS;
+}
+
+void TEST(NSString *msg, BOOL test) {
+ if (test) {
+ pass (msg);
+ } else {
+ fail (msg);
+ }
+}
+
+void assertRectsEqual (NSString *msg, NSRect r1, NSRect r2) {
+ BOOL equal = fuzzyCompare (r1.origin.x, r2.origin.x) &&
+ fuzzyCompare (r1.origin.y, r2.origin.y) &&
+ fuzzyCompare (r1.size.width, r2.size.width) &&
+ fuzzyCompare (r1.size.height, r2.size.height);
+ if (equal) {
+ pass (msg);
+ } else {
+ failFmt(@"%@ (expected (%f,%f:%fx%f) but got (%f,%f:%fx%f))",
+ msg,
+ r2.origin.x, r2.origin.y, r2.size.width, r2.size.height,
+ r1.origin.x, r1.origin.y, r1.size.width, r1.size.height);
+ }
+}
+
+void assertPointsEqual (NSString *msg, NSPoint p1, NSPoint p2) {
+ BOOL equal = fuzzyCompare (p1.x, p2.x) && fuzzyCompare (p1.y, p2.y);
+ if (equal) {
+ pass (msg);
+ } else {
+ failFmt(@"%@ (expected (%f,%f) but got (%f,%f)",
+ msg,
+ p2.x, p2.y,
+ p1.x, p1.y);
+ }
+}
+
+void assertFloatsEqual (NSString *msg, float f1, float f2) {
+ if (fuzzyCompare (f1, f2)) {
+ pass (msg);
+ } else {
+ failFmt(@"%@ (expected %f but got %f", msg, f2, f1);
+ }
+}
+
+void startTests() {
+ PASSES = 0;
+ FAILS = 0;
+}
+
+void endTests() {
+ PUTS(@"Done testing. %@%d%@ passed, %@%d%@ failed.",
+ GREEN, PASSES, OFF,
+ RED, FAILS, OFF);
+}
+
+void startTestBlock(NSString *name) {
+ PUTS(@"%@Starting %@%@%@ tests.", INDENT, BLUE, name, OFF);
+ ++depth;
+}
+
+void endTestBlock(NSString *name) {
+ --depth;
+ PUTS(@"%@Done with %@%@%@ tests.", INDENT, BLUE, name, OFF);
+}
+
+void setColorEnabled(BOOL b) {
+ colorEnabled = b;
+ if (b) {
+ RED = @"\033[31;1m";
+ GREEN = @"\033[32;1m";
+ BLUE = @"\033[36;1m";
+ OFF = @"\033[0m";
+ } else {
+ RED = @"";
+ GREEN = @"";
+ BLUE = @"";
+ OFF = @"";
+ }
+}
+
+#ifdef STAND_ALONE
+void runTests();
+
+int main() {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ setColorEnabled (NO);
+ startTests();
+
+ runTests();
+
+ endTests();
+
+ [pool drain];
+ return 0;
+}
+#endif
+
+// vim:ft=objc:ts=4:sts=4:sw=4:noet