dataschema.html revision 303f7fa80c85cc2236cb9138d002e0da34431d5e
d6fa26d0adaec6c910115be34fe7a5a5f402c14fMark Andrews<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
5347c0fcb04eaea19d9f39795646239f487c6207Tinderbox User<script type="text/javascript" src="/build/yui/yui.js"></script>
5347c0fcb04eaea19d9f39795646239f487c6207Tinderbox User<script type="text/javascript" src="/build/dataschema/dataschema-debug.js"></script>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein<p><input type="button" value="Run Tests" id="btnRun" disabled=true></p>
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User <tr> <td>1/23/1999</td> <td>29e8548592d8c82</td> <td>12</td> <td>$150.00</td></tr><tr> <td>5/19/1999</td> <td>83849</td> <td>8</td> <td>$60.00</td></tr><tr> <td>8/9/1999</td> <td>11348</td> <td>1</td> <td>$34.99</td></tr><tr> <td>1/23/2000</td> <td>29e8548592d8c82</td> <td>10</td> <td>$1.00</td></tr><tr> <td>4/28/2000</td> <td>37892857482836437378273</td> <td>123</td> <td>$33.32</td></tr><tr> <td>1/23/2001</td> <td>83849</td> <td>5</td> <td>$15.00</td></tr><tr> <td>9/30/2001</td> <td>224747</td> <td>14</td> <td>$56.78</td></tr>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein <tr> <td>1/23/1999</td> <td>29e8548592d8c82</td> <td>12</td> <td>$150.00</td></tr><tr> <td>5/19/1999</td> <td>83849</td> <td>8</td> <td>$60.00</td></tr><tr> <td>8/9/1999</td> <td>11348</td> <td>1</td> <td>$34.99</td></tr><tr> <td>1/23/2000</td> <td>29e8548592d8c82</td> <td>10</td> <td>$1.00</td></tr><tr> <td>4/28/2000</td> <td>37892857482836437378273</td> <td>123</td> <td>$33.32</td></tr><tr> <td>1/23/2001</td> <td>83849</td> <td>5</td> <td>$15.00</td></tr><tr> <td>9/30/2001</td> <td>224747</td> <td>44</td> <td>$56.78</td></tr>
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User <tr> <td>1/23/1999</td> <td>29e8548592d8c82</td> <td>1</td> <td>$150.00</td></tr><tr> <td>5/19/1999</td> <td>83849</td> <td>8</td> <td>$60.00</td></tr><tr> <td>8/9/1999</td> <td>11348</td> <td>1</td> <td>$34.99</td></tr><tr> <td>1/23/2000</td> <td>29e8548592d8c82</td> <td>10</td> <td>$1.00</td></tr><tr> <td>4/28/2000</td> <td>37892857482836437378273</td> <td>123</td> <td>$33.32</td></tr><tr> <td>1/23/2001</td> <td>83849</td> <td>5</td> <td>$15.00</td></tr><tr> <td>9/30/2001</td> <td>224747</td> <td>44</td> <td>$56.78</td></tr>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein <tr> <td>1/23/1999</td> <td>29e8548592d8c82</td> <td>1</td> <td>$150.00</td></tr><tr> <td>5/19/1999</td> <td>83849</td> <td>8</td> <td>$60.00</td></tr><tr> <td>8/9/1999</td> <td>11348</td> <td>1</td> <td>$34.99</td></tr><tr> <td>1/23/2000</td> <td>29e8548592d8c82</td> <td>10</td> <td>$1.00</td></tr><tr> <td>4/28/2000</td> <td>37892857482836437378273</td> <td>123</td> <td>$33.32</td></tr><tr> <td>1/23/2001</td> <td>83849</td> <td>5</td> <td>$15.00</td></tr><tr> <td>9/30/2001</td> <td>224747</td> <td>14</td> <td>$56.78</td></tr>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein(function() {
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User filter: "raw",
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User logInclude:{"TestRunner":true},
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein useConsole: true
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein }).use("console", "test", "dump", "dataschema", "datatype", function(Y) {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein // Set up the page
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein ARRAYASSERT = Y.ArrayAssert,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein OBJECTASSERT = Y.ObjectAssert,
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein btnRun = Y.get("#btnRun"),
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User myConsole = new Y.Console().render();
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein btnRun.set("disabled", false);
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User Y.on("click", function(){
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein var testJSON = new Y.Test.Case({
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User name: "JSON Tests",
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein testJSONMeta: function() {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein var schema = {
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User metaFields: {top:"top", nested:"second.nested"}
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User second: {nested: "bar"}
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein data_out = Y.DataSchema.JSON.apply(schema, data_in);
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User ASSERT.isObject(data_out.meta, "Expected meta property.");
e21a2904f02a03fa06b6db04d348f65fe9c67b2bMark Andrews ASSERT.areSame("foo", data_out.meta.top, "Expected first meta.");
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User ASSERT.areSame("bar", data_out.meta.nested, "Expected second meta.");
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein ASSERT.isArray(data_out.results, "Expected results property.");
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User ASSERT.areSame(0, data_out.results.length, "Expected zero results.");
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User testJSONResults: function() {
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User var schema = {
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User resultListLocator: "response",
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User resultFields: ["name", {key:"number", parser:Y.DataType.Number.parse}, "letter"]
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein {name: "alpha", number: "0", letter: "a"},
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein {name: "beta", number: "1", letter: "b"},
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User {name: "gamma", number: "2", letter: "c"}
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein data_out = Y.DataSchema.JSON.apply(schema, data_in);
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein ASSERT.isArray(data_out.results, "Expected results property.");
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein ASSERT.areSame(3, data_out.results.length, "Expected 3 results.");
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein ASSERT.areSame("alpha", data_out.results[0].name, "Expected first result.");
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User ASSERT.areSame("gamma", data_out.results[2].name, "Expected last result.");
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User ASSERT.areSame(0, data_out.results[0].number, "Expected first number to be parsed.");
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein ASSERT.areSame(2, data_out.results[2].number, "Expected last number to be parsed.");
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein ASSERT.isObject(data_out.meta, "Expected meta property.");
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein testJSONComplexLocators: function() {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein var schema = {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein metaFields: {metaTotal:"response['meta-total']", metaMessage:"response['data array'][1].response.message"},
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User resultListLocator:"response['data array'][0].response['i t e m s']",
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User resultFields: [
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein "['customer.data']['alert(\'id\')']",
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein "['array-pets'][0].name",
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein "['array-pets']"
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox Userrequest: "orig request", response: { "meta-total": 3, "data array" : [{ position: "array.item.0", "response": { "i t e m s": [ { /* result 0 */ name: "Bob", "customer.data": { "alert('id')":10, "phone/email": "123-4567", "catch":true }, "array-pets": [ { /* pet 0 */ "name":"Brutus", "breed": "bulldog" }, { /* pet 1 */ "name":"Bobo", "breed": "bernese" } ] }, { /* result 1 */ name: "Fran", "customer.data": { "alert('id')":11, "phone/email": "234-5678", "catch":false}, "array-pets": [ { /* pet 0 */ "name":"Fido", "breed": "french poodle" } ] } ] } }, { position: "array.item.1", "response": { "message": { type: "xyz", error: false } } }], metaid: { id:1234, date: new Date() } } },
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User data_out = Y.DataSchema.JSON.apply(schema, data_in);
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User ASSERT.isObject(data_out.meta, "Expected meta property.");
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User ASSERT.areSame(3, data_out.meta.metaTotal, "Expected meta total.");
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User ASSERT.areSame("xyz", data_out.meta.metaMessage.type, "Expected nested meta message type.");
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User ASSERT.areSame(false, data_out.meta.metaMessage.error, "Expected nested meta message error.");
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein ASSERT.isArray(data_out.results, "Expected results property.");
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein ASSERT.areSame(2, data_out.results.length, "Expected 2 results.");
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein ASSERT.areSame(10, data_out.results[0]["['customer.data']['alert(\'id\')']"], "Expected first id.");
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein ASSERT.areSame("234-5678", data_out.results[1]["['customer.data']['phone/email']"], "Expected second phone/email.");
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein ASSERT.areSame("Fido", data_out.results[1]["['array-pets'][0].name"], "Expected nested array item data.");
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein ASSERT.isArray(data_out.results[0]["['array-pets']"], "Expected array.");
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein ASSERT.areSame(2, data_out.results[0]["['array-pets']"].length, "Expected array length.");
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User testJSONNested: function() {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein var schema = {resultListLocator: "reference[1].fruit",
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein resultFields: ["name","calories"]
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein "current":160,
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User "reference": [
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User "category":"exercise",
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User "type":"expenditure",
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User "activities":[
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User {"name":"biking", "calories":550},
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User {"name":"golf", "calories":1000},
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User {"name":"running", "calories":650},
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein {"name":"swimming", "calories":650},
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User {"name":"walking", "calories":225}
7911e6f9de303bca5a3d8b34f4330c8f7cecffaeTinderbox User "category":"nutrition",
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein "type":"intake",
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein {"name":"apple", "calories":70},
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein {"name":"banana", "calories":70},
data_out = Y.DataSchema.JSON.apply(schema, data_in);
data_out = Y.DataSchema.JSON.apply(schema, data_in);
data_out = Y.DataSchema.JSON.apply(schema, data_in);
data_out = Y.DataSchema.JSON.apply(schema, data_in);
data_out = Y.DataSchema.JSON.apply(schema, data_in);
var testXML = new Y.Test.Case({
metaFields: {rootatt:{parser:Y.DataType.Number.parse, locator:"/myroot/@rootatt"}, topnode:"//top", nestedatt:"//second/@nested"}
data_in = Y.DataType.XML.parse("<myroot rootatt='0'><top>topvalue</top><second nested='nestedvalue' /><item type='foo'><name>Abc</name><rank>0</rank></item><item type='bar'><name>Def</name><rank>1</rank></item><item type='bat'><name>Ghi</name><rank>2</rank></item></myroot>"),
data_out = Y.DataSchema.XML.apply(schema, data_in);
resultFields: [{key:"type", locator:"@type"}, {key:"rank", parser:Y.DataType.Number.parse}, "name"]
data_in = Y.DataType.XML.parse("<myroot><item type='foo'><name>Abc</name><rank>0</rank></item><item type='bar'><name>Def</name><rank>1</rank></item><item type='bat'><name>Ghi</name><rank>2</rank></item></myroot>"),
data_out = Y.DataSchema.XML.apply(schema, data_in);
resultFields: [{key:"type", locator:"@type"}, {key:"rank", parser:Y.DataType.Number.parse}, "name"]
data_in = Y.DataType.XML.parse("<myroot><otheritems><item type='other'><name>Test</name><rank>-1</rank></item></otheritems><items><item type='foo'><name>Abc</name><rank>0</rank></item><item type='bar'><name>Def</name><rank>1</rank></item><item type='bat'><name>Ghi</name><rank>2</rank></item></items></myroot>"),
data_out = Y.DataSchema.XML.apply(schema, data_in);
metaFields: {rootatt:{parser:Y.DataType.Number.parse, locator:"/myroot/@rootatt"}, topnode:"//top", nestedatt:"//second/@nested"},
resultFields: [{key:"type", locator:"@type"}, {key:"rank", parser:Y.DataType.Number.parse}, "name", {key:"subnameatt", locator:"subitem/name/@type"}, {key:"age", locator:"subitem/age", parser:"number"}]
data_in = Y.DataType.XML.parse("<myroot rootatt='5'><top>topvalue</top><second nested='nestedsecond' /><allitems><livehere><item type='foo'><name type='nametype0'>Abc</name><rank>0</rank><subitem><name type='subnametype0'>subABC</name><age>10</age></subitem></item><item type='bar'><name type='nametype1'>Def</name><rank>1</rank><subitem><name type='subnametype1'>subDEF</name><age>11</age></subitem></item><item type='bat'><name type='nametype2'>Ghi</name><rank>2</rank><subitem><name type='subnametype2'>subGHI</name><age>12</age></subitem></item></livehere></allitems></myroot>"),
data_out = Y.DataSchema.XML.apply(schema, data_in);
ASSERT.areSame("subnametype0", data_out.results[0].subnameatt, "Expected first subitem name attribute.");
ASSERT.areSame("subnametype2", data_out.results[2].subnameatt, "Expected last subitemnameattribute.");
{key:"rank", parser:Y.DataType.Number.parse},
data_in = Y.DataType.XML.parse("<myroot><item type='foo'><attributes><attribute units='foo1'>bar1</attribute><attribute units='foo2'>bar2</attribute></attributes><name>Abc</name><rank>0</rank></item><item type='bar'><attributes><attribute units='foo3'>bar3</attribute><attribute units='foo4'>bar4</attribute></attributes><name>Def</name><rank>1</rank></item><item type='bat'><name>Ghi</name><rank>2</rank></item></myroot>"),
data_out = Y.DataSchema.XML.apply(schema, data_in);
resultFields: ["type", {key:"rank", parser:Y.DataType.Number.parse}, "name"]
data_in = Y.DataType.XML.parse("<root><item type='foo'><name>Abc</name><rank>1</rank></item><item type='bar'><name>Def</name><rank>2</rank></item></root>"),
data_out = Y.DataSchema.XML.apply(schema, data_in);
schema.resultsListLocator = "item";
data_out = Y.DataSchema.XML.apply(schema, data_in);
var testHTML = new Y.Test.Case({
{key:"quantity", locator:"td[3]", parser:Y.DataType.Number.parse},
data_out = Y.DataSchema.XML.apply(schema, data_in);
ASSERT.areSame(14, data_out.results[data_out.results.length-1]["quantity"], "Expected last result.");
{key:"quantity", locator:"td[3]", parser:Y.DataType.Number.parse},
Y.all("#multipletbody tbody tr").each(function(n){
data_out = Y.DataSchema.XML.apply(schema, data_in);
ASSERT.areSame(14, data_out.results[data_out.results.length-1]["quantity"], "Expected last result.");
var testArray = new Y.Test.Case({
data_out = Y.DataSchema.Array.apply(schema, data_in);
data_out = Y.DataSchema.Array.apply(schema, data_in);
data_out = Y.DataSchema.Array.apply(schema, data_in);
data_out = Y.DataSchema.Array.apply(schema, data_in);
data_out = Y.DataSchema.Array.apply(schema, data_in);
data_out = Y.DataSchema.Array.apply(schema, data_in);
var testText = new Y.Test.Case({
data_out = Y.DataSchema.Text.apply(schema, data_in);
data_out = Y.DataSchema.Text.apply(schema, data_in);
data_out = Y.DataSchema.Text.apply(schema, data_in);
data_out = Y.DataSchema.Text.apply(schema, data_in);
var suite = new Y.Test.Suite({name:"DataSchema Test Suite"});
suite.add(testJSON);
suite.add(testXML);
suite.add(testHTML);
suite.add(testArray);
suite.add(testText);
Y.Test.Runner.setName("DataSchema Test Runner");
Y.Test.Runner.add(suite);