GUI -- TableService can take a div, config object, and data object in order to programmatically render and load data into a table. Test functions added.

Change-Id: I95f82108d7bb4f84a701b49e0e419afbdbac6f14
diff --git a/web/gui/src/main/webapp/tests/app/fw/widget/table-spec.js b/web/gui/src/main/webapp/tests/app/fw/widget/table-spec.js
index 12d0390..688897c 100644
--- a/web/gui/src/main/webapp/tests/app/fw/widget/table-spec.js
+++ b/web/gui/src/main/webapp/tests/app/fw/widget/table-spec.js
@@ -18,7 +18,54 @@
  ONOS GUI -- Widget -- Table Service - Unit Tests
  */
 describe('factory: fw/widget/table.js', function() {
-    var ts, $log;
+    var ts, $log, d3Elem;
+
+    var config = {
+        colIds: ['id', 'mfr', 'hw', 'sw', 'serial', 'annotations.protocol'],
+        colText: ['URI', 'Vendor', 'Hardware Version', 'Software Version',
+            'Serial Number', 'Protocol']
+        },
+        fakeData = {
+            "devices": [{
+                "id": "of:0000000000000001",
+                "available": true,
+                "_iconid_available": "deviceOnline",
+                "role": "MASTER",
+                "mfr": "Nicira, Inc.",
+                "hw": "Open vSwitch",
+                "sw": "2.0.1",
+                "serial": "None",
+                "annotations": {
+                    "protocol": "OF_10"
+                }
+            },
+                {
+                    "id": "of:0000000000000004",
+                    "available": false,
+                    "_iconid_available": "deviceOffline",
+                    "role": "MASTER",
+                    "mfr": "Nicira, Inc.",
+                    "hw": "Open vSwitch",
+                    "sw": "2.0.1",
+                    "serial": "None",
+                    "annotations": {
+                        "protocol": "OF_10"
+                    }
+                },
+                {
+                    "id": "of:0000000000000092",
+                    "available": false,
+                    "_iconid_available": "deviceOffline",
+                    "role": "MASTER",
+                    "mfr": "Nicira, Inc.",
+                    "hw": "Open vSwitch",
+                    "sw": "2.0.1",
+                    "serial": "None",
+                    "annotations": {
+                        "protocol": "OF_10"
+                    }
+                }]
+        };
 
     beforeEach(module('onosWidget'));
 
@@ -30,4 +77,58 @@
     it('should define TableService', function () {
         expect(ts).toBeDefined();
     });
-});
\ No newline at end of file
+
+    function verifyTableTags(div) {
+        var table = div.select('table'),
+            tableHeaders;
+        expect(table).toBeTruthy();
+        expect(table.attr('fixed-header')).toBeTruthy();
+        expect(table.select('thead')).toBeTruthy();
+        expect(table.select('tbody')).toBeTruthy();
+
+        tableHeaders = table.select('thead').selectAll('th');
+        tableHeaders.each(function(thElement, i) {
+            thElement = d3.select(this);
+            expect(thElement).toBeTruthy();
+            expect(thElement.html()).toBe(config.colText[i]);
+        });
+    }
+
+    function verifyData(div) {
+        var tbody = div.select('tbody'),
+            tableBoxes = tbody.selectAll('td');
+        expect(tbody).toBeTruthy();
+        expect(tbody.select('tr')).toBeTruthy();
+
+        tableBoxes.each(function(tdElement, i){
+            tdElement = d3.select(this);
+            if(i === 0) {
+                expect(tdElement.html()).toBe('of:0000000000000001');
+            }
+            if(i === 1) {
+                expect(tdElement.html()).toBe('Nicira, Inc.');
+            }
+            if(i === 2) {
+                expect(tdElement.html()).toBe('Open vSwitch');
+            }
+            expect(tdElement).toBeTruthy();
+        });
+    }
+
+    it('should create table tags', function () {
+        ts.renderTable(d3Elem, config);
+        verifyTableTags(d3Elem);
+    });
+
+    it('should load data into table', function () {
+        var colIds = ts.renderTable(d3Elem, config);
+        ts.loadTableData(fakeData, d3Elem, colIds);
+        verifyData(d3Elem);
+    });
+
+    it('should render table and load data', function () {
+        ts.renderAndLoadTable(d3Elem, config, fakeData);
+        verifyData(d3Elem);
+    });
+
+});