dataschema.html revision df5496ef3926fd0ea425cd4aa5eb278364c98d5c
7070667c2dffad87009999bdeb16d5305e0afdbejvergara<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
7070667c2dffad87009999bdeb16d5305e0afdbejvergara<script type="text/javascript" src="/build/yui/yui.js"></script>
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac<p><input type="button" value="Run Tests" id="btnRun" disabled=true></p>
7070667c2dffad87009999bdeb16d5305e0afdbejvergara <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>
7070667c2dffad87009999bdeb16d5305e0afdbejvergara <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>
7070667c2dffad87009999bdeb16d5305e0afdbejvergara <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>
7070667c2dffad87009999bdeb16d5305e0afdbejvergara <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>
7070667c2dffad87009999bdeb16d5305e0afdbejvergara(function() {
d6a37b477bb2d0a678fcbca00656581919a6b59aludo filter: (window.location.search.match(/[?&]filter=([^&]+)/) || [])[1] || 'min',
7070667c2dffad87009999bdeb16d5305e0afdbejvergara allowRollup: false,
7070667c2dffad87009999bdeb16d5305e0afdbejvergara useBrowserConsole: false
7070667c2dffad87009999bdeb16d5305e0afdbejvergara }).use("console", "test", "dump", "dataschema", "datatype", function(Y) {
7070667c2dffad87009999bdeb16d5305e0afdbejvergara // Set up the page
7070667c2dffad87009999bdeb16d5305e0afdbejvergara var ASSERT = Y.Assert,
7070667c2dffad87009999bdeb16d5305e0afdbejvergara ARRAYASSERT = Y.ArrayAssert,
d6a37b477bb2d0a678fcbca00656581919a6b59aludo OBJECTASSERT = Y.ObjectAssert,
7070667c2dffad87009999bdeb16d5305e0afdbejvergara btnRun = Y.one("#btnRun"),
7070667c2dffad87009999bdeb16d5305e0afdbejvergara myConsole = new Y.Console().render();
7070667c2dffad87009999bdeb16d5305e0afdbejvergara btnRun.set("disabled", false);
7070667c2dffad87009999bdeb16d5305e0afdbejvergara Y.on("click", function(){
7070667c2dffad87009999bdeb16d5305e0afdbejvergara }, btnRun);
7070667c2dffad87009999bdeb16d5305e0afdbejvergara var testJSON = new Y.Test.Case({
5bb2162d7eb205c7004d31d9c4df045451211f14neil_a_wilson name: "JSON Tests",
7070667c2dffad87009999bdeb16d5305e0afdbejvergara testJSONMeta: function() {
7070667c2dffad87009999bdeb16d5305e0afdbejvergara var schema = {
7070667c2dffad87009999bdeb16d5305e0afdbejvergara metaFields: {top:"top", nested:"second.nested"}
7070667c2dffad87009999bdeb16d5305e0afdbejvergara data_in = {
386eb5e2f6ec332c6b75fe42e75378332478daa5ludo top: "foo",
386eb5e2f6ec332c6b75fe42e75378332478daa5ludo second: {nested: "bar"}
7070667c2dffad87009999bdeb16d5305e0afdbejvergara data_out = Y.DataSchema.JSON.apply(schema, data_in);
7070667c2dffad87009999bdeb16d5305e0afdbejvergara ASSERT.isObject(data_out.meta, "Expected meta property.");
7070667c2dffad87009999bdeb16d5305e0afdbejvergara ASSERT.areSame("foo", data_out.meta.top, "Expected first meta.");
7070667c2dffad87009999bdeb16d5305e0afdbejvergara ASSERT.areSame("bar", data_out.meta.nested, "Expected second meta.");
7070667c2dffad87009999bdeb16d5305e0afdbejvergara ASSERT.isArray(data_out.results, "Expected results property.");
651679ffb61ac7cab7e2c8e30cdfa92e26632824JnRouvignac ASSERT.areSame(0, data_out.results.length, "Expected zero results.");
7070667c2dffad87009999bdeb16d5305e0afdbejvergara testJSONResults: function() {
7070667c2dffad87009999bdeb16d5305e0afdbejvergara var schema = {
7070667c2dffad87009999bdeb16d5305e0afdbejvergara resultListLocator: "response",
53247d28ba99538f841a13ea2cde01c3faa3ef36kenneth_suter resultFields: [
7070667c2dffad87009999bdeb16d5305e0afdbejvergara { key:"number",
7070667c2dffad87009999bdeb16d5305e0afdbejvergara data_in = {
797b7557ad71a61ffb72a68f4457a3d999e7e252jvergara response: [
d1851659eb289148300ed85b2379e8a993bf69aajvergara {name: "alpha", number: "0", letter: "a"},
797b7557ad71a61ffb72a68f4457a3d999e7e252jvergara {name: "beta", number: "1", letter: "b"},
797b7557ad71a61ffb72a68f4457a3d999e7e252jvergara {name: "gamma", number: "2", letter: "c"}
797b7557ad71a61ffb72a68f4457a3d999e7e252jvergara data_out = Y.DataSchema.JSON.apply(schema, data_in);
797b7557ad71a61ffb72a68f4457a3d999e7e252jvergara ASSERT.isArray(data_out.results, "Expected results property.");
797b7557ad71a61ffb72a68f4457a3d999e7e252jvergara ASSERT.areSame(3, data_out.results.length, "Expected 3 results.");
797b7557ad71a61ffb72a68f4457a3d999e7e252jvergara ASSERT.areSame("alpha", data_out.results[0].name, "Expected first result.");
797b7557ad71a61ffb72a68f4457a3d999e7e252jvergara ASSERT.areSame("gamma", data_out.results[2].name, "Expected last result.");
797b7557ad71a61ffb72a68f4457a3d999e7e252jvergara ASSERT.areSame(0, data_out.results[0].number, "Expected first number to be parsed.");
797b7557ad71a61ffb72a68f4457a3d999e7e252jvergara ASSERT.areSame(2, data_out.results[2].number, "Expected last number to be parsed.");
797b7557ad71a61ffb72a68f4457a3d999e7e252jvergara ASSERT.isObject(data_out.meta, "Expected meta property.");
797b7557ad71a61ffb72a68f4457a3d999e7e252jvergara testJSONNested: function() {
797b7557ad71a61ffb72a68f4457a3d999e7e252jvergara var schema = {resultListLocator: "reference[1].fruit",
797b7557ad71a61ffb72a68f4457a3d999e7e252jvergara resultFields: ["name","calories"]
7070667c2dffad87009999bdeb16d5305e0afdbejvergara data_in = {
7070667c2dffad87009999bdeb16d5305e0afdbejvergara "profile":{
7070667c2dffad87009999bdeb16d5305e0afdbejvergara "current":160,
386eb5e2f6ec332c6b75fe42e75378332478daa5ludo "target":150
386eb5e2f6ec332c6b75fe42e75378332478daa5ludo "reference": [
386eb5e2f6ec332c6b75fe42e75378332478daa5ludo "category":"exercise",
386eb5e2f6ec332c6b75fe42e75378332478daa5ludo "type":"expenditure",
7070667c2dffad87009999bdeb16d5305e0afdbejvergara "activities":[
7070667c2dffad87009999bdeb16d5305e0afdbejvergara {"name":"biking", "calories":550},
7070667c2dffad87009999bdeb16d5305e0afdbejvergara {"name":"golf", "calories":1000},
7070667c2dffad87009999bdeb16d5305e0afdbejvergara {"name":"running", "calories":650},
7070667c2dffad87009999bdeb16d5305e0afdbejvergara {"name":"swimming", "calories":650},
7070667c2dffad87009999bdeb16d5305e0afdbejvergara {"name":"walking", "calories":225}
7070667c2dffad87009999bdeb16d5305e0afdbejvergara "category":"nutrition",
53247d28ba99538f841a13ea2cde01c3faa3ef36kenneth_suter "type":"intake",
386eb5e2f6ec332c6b75fe42e75378332478daa5ludo {"name":"apple", "calories":70},
386eb5e2f6ec332c6b75fe42e75378332478daa5ludo {"name":"banana", "calories":70},
7070667c2dffad87009999bdeb16d5305e0afdbejvergara {"name":"orange", "calories":90},
7070667c2dffad87009999bdeb16d5305e0afdbejvergara "vegetables":[
7070667c2dffad87009999bdeb16d5305e0afdbejvergara {"name":"baked potato", "calories":150},
7070667c2dffad87009999bdeb16d5305e0afdbejvergara {"name":"broccoli", "calories":50},
7070667c2dffad87009999bdeb16d5305e0afdbejvergara {"name":"green beans", "calories":30}
data_out = Y.DataSchema.JSON.apply(schema, data_in);
data_out_1 = Y.DataSchema.JSON.apply(schema_1, data_in_1),
data_out_2 = Y.DataSchema.JSON.apply(schema_2, data_in_2),
resultFields: [{ key: "name", locator: "value" }, { key: "mood", locator: "notes.mood"}]
data_out_3 = Y.DataSchema.JSON.apply(schema_3, data_in_3);
{ key: "First Name", locator: "president.fname" },
{ key: "Last Name", locator: "president.lastname" }
data_out = Y.DataSchema.JSON.apply(schema, data_in);
metaFields: {metaTotal:"response['meta-total']", metaMessage:"response['data array'][1].response.message"},
"['customer.data']['alert(\'id\')']",
position: "array.item.0",
"customer.data": {
"customer.data": {
position: "array.item.1",
data_out = Y.DataSchema.JSON.apply(schema, data_in);
ASSERT.areSame(10, data_out.results[0]["['customer.data']['alert(\'id\')']"], "Expected first id.");
ASSERT.areSame("234-5678", data_out.results[1]["['customer.data']['phone/email']"], "Expected second phone/email.");
ASSERT.areSame("Fido", data_out.results[1]["['array-pets'][0].name"], "Expected nested array item data.");
data_out = Y.DataSchema.JSON.apply(schema, data_in);
ASSERT.areSame("orange", data_out.results[data_out.results.length-1].name, "Expected last result.");
resultFields: ["fruit.name","cal[0].ries"]
{"fruit.name":"apple", "cal[0].ries":70},
{"fruit.name":"banana", "cal[0].ries":70},
{"fruit.name":"orange", "cal[0].ries":90}
data_out = Y.DataSchema.JSON.apply(schema, data_in);
data_out = Y.DataSchema.JSON.apply(schema, data_in);
{ key: 'difficulty', locator: 'difficulty.level' }
data_out = Y.DataSchema.JSON.apply(schema, data_in);
ASSERT.areSame(data_out.results[1].name, "Yeti", "Expect current locators work with nested schemas");
ASSERT.areSame(data_out.results[1].strategy.results[0].description, "Must be in Lojban", "Expected nested simple locators");
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);