Index: CMakeLists.txt
===================================================================
--- CMakeLists.txt	(revision 58575)
+++ CMakeLists.txt	(working copy)
@@ -8,6 +8,7 @@
 BRLCAD_ADDEXEC(tester_bn_poly_synthetic_div bn_poly_synthetic_div.c "libbu;libbn" NO_INSTALL)
 BRLCAD_ADDEXEC(tester_bn_obr bn_obr.c "libbu;libbn" NO_INSTALL)
 BRLCAD_ADDEXEC(tester_bn_chull bn_chull.c "libbu;libbn" NO_INSTALL)
+BRLCAD_ADDEXEC(tester_bn_plane_3pts_collinear bn_plane_3pts_collinear.c "libbu;libbn" NO_INSTALL)
 CMAKEFILES(bn_poly_cubic_roots.c bn_poly_quartic_roots.c bn_obr.c)
 
 # For tester_bn_tri_tri_isect_coplanar, the input format is as follows:
@@ -85,6 +86,37 @@
 #  ************ obr.c tests *************
 #add_test(bn_obr_simple			tester_bn_obr) # Default points
 
+#
+#  ************ plane.c tests *************
+
+# For tester_bn_plane_3pts_collinear.c, the input format is as follows:
+#
+# tester_bn_plane_3pts_collinear P0 P1 P2 <expected result>
+#
+# where P and Q are the points in questioni. An individual point
+# is three integer or floating point numbers separated by commas.
+
+add_test(bn_plane_3pts_collinear_false_1        tester_bn_plane_3pts_collinear 0,0,0 1,1,1 6,3,8 0)
+add_test(bn_plane_3pts_collinear_false_2        tester_bn_plane_3pts_collinear 0,0,0 6,3,8 1,1,1 0)
+add_test(bn_plane_3pts_collinear_false_3        tester_bn_plane_3pts_collinear 1,1,1 0,0,0 6,3,8 0)
+add_test(bn_plane_3pts_collinear_false_4        tester_bn_plane_3pts_collinear 1,1,1 6,3,8 0,0,0 0)
+add_test(bn_plane_3pts_collinear_false_5        tester_bn_plane_3pts_collinear 6,3,8 1,1,1 0,0,0  0)
+add_test(bn_plane_3pts_collinear_false_6        tester_bn_plane_3pts_collinear 6,3,8 0,0,0 1,1,1 0)
+add_test(bn_plane_3pts_collinear_same           tester_bn_plane_3pts_collinear 5.3,8.1,9.6 5.3,8.1,9.6 5.3,8.1,9.6 0)
+add_test(bn_plane_3pts_collinear_partial_same_1 tester_bn_plane_3pts_collinear 6,2,4 6,2,4 9.3,8.1,4.6 1)
+# This test fails, but I think that it shouldn't --- it seems to be
+# showing that point order matters since it is the same three points
+# as the preceding and following tests, but makes a different result.
+add_test(bn_plane_3pts_collinear_partial_same_2 tester_bn_plane_3pts_collinear 9.3,8.1,4.6 6,2,4 6,2,4 1)
+add_test(bn_plane_3pts_collinear_partial_same_3 tester_bn_plane_3pts_collinear 6,2,4 9.3,8.1,4.6 6,2,4 1)
+add_test(bn_plane_3pts_collinear_true_1         tester_bn_plane_3pts_collinear 1.8,4.6,2.2 5.4,13.8,6.6 16.2,41.4,19.8 1)
+add_test(bn_plane_3pts_collinear_true_2         tester_bn_plane_3pts_collinear 1.8,4.6,2.2 16.2,41.4,19.8 5.4,13.8,6.6 1)
+add_test(bn_plane_3pts_collinear_true_3         tester_bn_plane_3pts_collinear 5.4,13.8,6.6 1.8,4.6,2.2 16.2,41.4,19.8 1)
+add_test(bn_plane_3pts_collinear_true_4         tester_bn_plane_3pts_collinear 5.4,13.8,6.6 16.2,41.4,19.8 1.8,4.6,2.2 1)
+add_test(bn_plane_3pts_collinear_true_5         tester_bn_plane_3pts_collinear 16.2,41.4,19.8 1.8,4.6,2.2 5.4,13.8,6.6 1)
+add_test(bn_plane_3pts_collinear_true_6         tester_bn_plane_3pts_collinear 16.2,41.4,19.8 5.4,13.8,6.6 1.8,4.6,2.2 1)
+
+
 # Local Variables:
 # tab-width: 8
 # mode: cmake
Index: bn_plane_3pts_collinear.c
===================================================================
--- bn_plane_3pts_collinear.c	(revision 0)
+++ bn_plane_3pts_collinear.c	(working copy)
@@ -0,0 +1,88 @@
+/*         B N _ P L A N E _ 3 P T _ C O L L I N E A R . C
+ * BRL-CAD
+ *
+ * Copyright (c) 2013 United States Government as represented by
+ * the U.S. Army Research Laboratory.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * version 2.1 as published by the Free Software Foundation.
+ *
+ * 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 file; see the file named COPYING for more
+ * information.
+ */
+
+#include "common.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "bu.h"
+#include "bn.h"
+
+
+int
+main(int argc, char **argv)
+{
+    int expected_result = 0;
+    int actual_result = 0;
+    float f1, f2, f3 = 0.0;
+    point_t P0 = VINIT_ZERO;
+    point_t P1 = VINIT_ZERO;
+    point_t P2 = VINIT_ZERO;
+    struct bn_tol tol;
+
+    /* These values were stolen from ../bntester.c */
+    tol.magic = BN_TOL_MAGIC;
+    tol.dist = BN_TOL_DIST;
+    tol.dist_sq = tol.dist * tol.dist;
+    tol.perp = 1e-6;
+    tol.para = 1.0 - tol.perp;
+
+    if (argc != 5) {
+	bu_exit(1, "ERROR: input format is P0x,P0y,P0z P1x,P1y,P1z P2x,P2y,P2z expected_result [%s]\n", argv[0]);
+    }
+
+    sscanf(argv[1], "%f,%f,%f", &f1, &f2, &f3);
+    P0[X] = f1;
+    P0[Y] = f2;
+    P0[Z] = f3;
+    sscanf(argv[2], "%f,%f,%f", &f1, &f2, &f3);
+    P1[X] = f1;
+    P1[Y] = f2;
+    P1[Z] = f3;
+    sscanf(argv[3], "%f,%f,%f", &f1, &f2, &f3);
+    P2[X] = f1;
+    P2[Y] = f2;
+    P2[Z] = f3;
+    sscanf(argv[4], "%d", &expected_result);
+
+    actual_result = bn_3pts_collinear(P0, P1, P2, &tol);
+
+    bu_log("result: %d\n", actual_result);
+
+    if(expected_result == actual_result) {
+	return 0;
+    } else {
+	return -1;
+    }
+}
+
+
+/** @} */
+/*
+ * Local Variables:
+ * mode: C
+ * tab-width: 8
+ * indent-tabs-mode: t
+ * c-file-style: "stroustrup"
+ * End:
+ * ex: shiftwidth=4 tabstop=8
+ */
