GUI -- Completed implementation of Instance events (add, update, remove)
- fixed instance color selection (using cat7() function)
- miscellaneous additions to utility functions.
- etc. and so on...

Change-Id: I61895489ccc60fa17beda9e920e65742e0f2c526
diff --git a/web/gui/src/main/webapp/tests/app/fw/util/fn-spec.js b/web/gui/src/main/webapp/tests/app/fw/util/fn-spec.js
index e5b7223..e21980d 100644
--- a/web/gui/src/main/webapp/tests/app/fw/util/fn-spec.js
+++ b/web/gui/src/main/webapp/tests/app/fw/util/fn-spec.js
@@ -38,7 +38,6 @@
         $window.innerHeight = 200;
     }));
 
-
     // === Tests for isF()
     it('isF(): null for undefined', function () {
         expect(fs.isF(undefined)).toBeNull();
@@ -181,15 +180,33 @@
             b: 'not-a-function'
         }, ['b', 'a'])).toBeFalsy();
     });
-    it('areFunctions(): extraneous stuff ignored', function () {
+    it('areFunctions(): extraneous stuff NOT ignored', function () {
         expect(fs.areFunctions({
             a: function () {},
             b: function () {},
             c: 1,
             d: 'foo'
+        }, ['a', 'b'])).toBeFalsy();
+    });
+    it('areFunctions(): extraneous stuff ignored (alternate fn)', function () {
+        expect(fs.areFunctionsNonStrict({
+            a: function () {},
+            b: function () {},
+            c: 1,
+            d: 'foo'
         }, ['a', 'b'])).toBeTruthy();
     });
 
+    // == use the now-tested areFunctions on our own api:
+    it('should define api functions', function () {
+        expect(fs.areFunctions(fs, [
+            'isF', 'isA', 'isS', 'isO', 'contains',
+            'areFunctions', 'areFunctionsNonStrict', 'windowSize', 'find'
+        ])).toBeTruthy();
+    });
+
+
+
 
     // === Tests for windowSize()
     it('windowSize(): noargs', function () {
@@ -215,4 +232,7 @@
         expect(dim.width).toEqual(199);
         expect(dim.height).toEqual(99);
     });
+
+    // TODO: write unit tests for find()
+
 });