make .properties() more tolerant
[microdatajs:microdatajs.git] / test / jquery.microdata.unit.js
1 /* -*- mode: js2; js2-basic-offset: 2; indent-tabs-mode: nil -*- */
2
3 test('jQuery.fn.items', function() {
4   function t(context, types, expected) {
5     var msg = '$(';
6     msg += context == document ? 'document' : ("'"+context+"'");
7     msg += ').items(';
8     if (types)
9       msg += "'"+types+"'";
10     msg += ')';
11     same($(context).items(types).toArray(),
12          $.map(expected, function(id) { return document.getElementById(id); }),
13          msg);
14   }
15   t(document, undefined, ['w', 'x', 'loops', 'ioItem']);
16   t('#x', undefined, []);
17   t('#io', undefined, ['ioItem']);
18   t(document, 'http://n.whatwg.org/work', ['w', 'x']);
19   t(document, 'bogus', []);
20 });
21
22 test('jQuery.fn.properties', function() {
23   function t(selector, expected) {
24     same($(selector).properties().toArray(),
25          $.map(expected, function(id) { return document.getElementById(id); }),
26          selector);
27   }
28   t('#testdata', []);
29   t('#w', ['w0', 'w1', 'w2', 'w3']);
30   t('#x', ['w2', 'w3', 'x0', 'x1']);
31   t('#loops', ['plain', 'loop0','loop1', 'loop2', 'loop3', 'loop4']);
32   t('#loop0', []);
33   t('#loop1', ['loop2']);
34   t('#loop2', []);
35   t('#loop3', []);
36   t('#loop4', []);
37   t('#ioItem', ['ioBefore', 'ioChild', 'ioAfter']);
38 });
39
40 function testStringReflection($elm, attr, func, attrString, funcString) {
41   // attrString is the content attribute value, while funcString is
42   // the expected value when getting the property (if given)
43   if (typeof funcString == 'undefined')
44     funcString = attrString;
45
46   if (typeof $elm == 'string')
47     $elm = $(document.createElement($elm));
48
49   // attr -> getter
50   equals($elm[func](), '', 'get empty string');
51   $elm.attr(attr, attrString);
52   equals($elm[func](), funcString, 'get reflected string');
53   $elm.removeAttr(attr);
54   equals($elm[func](), '', 'get empty string');
55
56   // setter -> attr
57   ok(!$elm.attr(attr), 'no attr');
58   //equal($elm.attr(attr), undefined, 'no attr');
59   $elm[func](attrString);
60   equals($elm.attr(attr), attrString, 'reflected attr');
61   $elm[func]('');
62   equals($elm.attr(attr), '', 'empty attr');
63 }
64
65 test('jQuery.fn.itemScope', function() {
66   var $elm = $(document.createElement('div'));
67   // attr -> getter
68   equals($elm.itemScope(), false);
69   $elm.attr('itemscope', '');
70   equals($elm.itemScope(), true);
71   $elm.get(0).removeAttribute('itemscope');
72   equals($elm.itemScope(), false);
73   // setter -> attr
74   equals($elm.attr('itemscope'), undefined);
75   $elm.itemScope(true);
76   equals($elm.attr('itemscope'), 'itemscope');
77   $elm.itemScope(false);
78   equals($elm.attr('itemscope'), undefined);
79 });
80
81 test('jQuery.fn.itemType', function() {
82   testStringReflection('div', 'itemtype', 'itemType', '#type');
83 });
84
85 test('jQuery.fn.itemId', function() {
86   testStringReflection('div', 'itemid', 'itemId', '#id', window.location.href+'#id');
87   testStringReflection('div', 'itemid', 'itemId', 'http://example.com/id');
88   testStringReflection('div', 'itemid', 'itemId', 'urn:isbn:0-330-34032-8');
89 });
90
91 test('jQuery.fn.itemProp', function() {
92   function t(html, expected) {
93     same($(html).itemProp().toArray(), expected);
94   }
95   t('<meta>', []);
96   t('<meta itemprop="do">', ['do']);
97   t('<meta itemprop="do re">', ['do', 're']);
98   t('<meta itemprop="re do">', ['re', 'do']);
99   t('<meta itemprop="do do">', ['do']);
100   t('<meta itemprop="do re do">', ['do', 're']);
101 });
102
103 test('jQuery.fn.itemRef', function() {
104   function t(html, expected) {
105     same($(html).itemRef().toArray(), expected);
106   }
107   t('<meta>', []);
108   t('<meta itemref="do">', ['do']);
109   t('<meta itemref="do re">', ['do', 're']);
110   t('<meta itemref="re do">', ['re', 'do']);
111   t('<meta itemref="do do">', ['do']);
112   t('<meta itemref="do re do">', ['do', 're']);
113 });
114
115 module('jQuery.fn.itemValue');
116
117 test('no @itemprop', function() {
118   var $elm = $(document.createElement('div'));
119   equals($elm.itemValue(), null);
120   $elm.itemValue('foo');
121   equals($elm.itemValue(), null);
122 });
123
124 test('@itemscope', function() {
125   var $elm = $('<div itemprop itemscope></div>');
126   equals($elm.itemValue(), $elm.get(0));
127   $elm.itemValue('foo');
128   equals($elm.itemValue(), $elm.get(0));
129 });
130
131 test('meta', function() {
132   testStringReflection($('<meta itemprop>'), 'content', 'itemValue', 'foo');
133 });
134
135 test('audio', function() {
136   testStringReflection($('<audio itemprop></audio>'), 'src', 'itemValue', '#foo', window.location.href+'#foo');
137 });
138
139 test('embed', function() {
140   testStringReflection($('<embed itemprop>'), 'src', 'itemValue', '#foo', window.location.href+'#foo');
141 });
142
143 test('iframe', function() {
144   testStringReflection($('<iframe itemprop></iframe>'), 'src', 'itemValue', '#foo', window.location.href+'#foo');
145 });
146
147 test('img', function() {
148   testStringReflection($('<img itemprop>'), 'src', 'itemValue', '#foo', window.location.href+'#foo');
149 });
150
151 test('source', function() {
152   testStringReflection($('<source itemprop>'), 'src', 'itemValue', '#foo', window.location.href+'#foo');
153 });
154
155 test('video', function() {
156   testStringReflection($('<video itemprop></video>'), 'src', 'itemValue', '#foo', window.location.href+'#foo');
157 });
158
159 test('a', function() {
160   testStringReflection($('<a itemprop></a>'), 'href', 'itemValue', '#foo', window.location.href+'#foo');
161 });
162
163 test('area', function() {
164   testStringReflection($('<area itemprop>'), 'href', 'itemValue', '#foo', window.location.href+'#foo');
165 });
166
167 test('link', function() {
168   testStringReflection($('<link itemprop>'), 'href', 'itemValue', '#foo', window.location.href+'#foo');
169 });
170
171 test('object', function() {
172   testStringReflection($('<object itemprop></object>'), 'data', 'itemValue', '#foo', window.location.href+'#foo');
173 });
174
175 test('time', function() {
176   // read-only for now
177   equals($('<time></time>').itemValue(), undefined);
178   equals($('<time itemprop>now</time>').itemValue(), 'now');
179   equals($('<time itemprop datetime="1984-09-03">then</time>').itemValue(), '1984-09-03');
180 /*
181   // text -> getter
182   $elm.text('now');
183   equals($elm.itemValue(), 'now');
184   // setter -> text
185   $elm.itemValue('later');
186   equals($elm.text(), 'later');
187   // attr -> getter
188   $elm.attr('datetime', '2010-01-24');
189   equals($elm.itemValue(), '2010-01-24');
190   // setter -> attr
191   $elm.itemValue('1984-09-03');
192   equals($elm.attr('datetime'), '1984-09-03');
193 */
194 });