Index: tests/html/svg_test.dart |
diff --git a/tests/html/svg_test.dart b/tests/html/svg_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0c6071271a20b03c9b751c1567df2493c3d2b38a |
--- /dev/null |
+++ b/tests/html/svg_test.dart |
@@ -0,0 +1,247 @@ |
+// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library SVGTest; |
+import '../../pkg/unittest/lib/unittest.dart'; |
+import '../../pkg/unittest/lib/html_individual_config.dart'; |
+import 'dart:html'; |
+import 'dart:svg' as svg; |
+ |
+main() { |
+ useHtmlIndividualConfiguration(); |
+ |
+ group('svgPresence', () { |
+ var isSvgElement = predicate((x) => x is svg.SvgElement, 'is a SvgElement'); |
+ |
+ test('simpleRect', () { |
+ var div = new Element.tag('div'); |
+ document.body.nodes.add(div); |
+ div.innerHtml = r''' |
+<svg id='svg1' width='200' height='100'> |
+<rect id='rect1' x='10' y='20' width='130' height='40' rx='5'fill='blue'></rect> |
+</svg> |
+ |
+'''; |
+ |
+ var e = document.query('#svg1'); |
+ expect(e, isNotNull); |
+ |
+ svg.RectElement r = document.query('#rect1'); |
+ expect(r.x.baseVal.value, 10); |
+ expect(r.y.baseVal.value, 20); |
+ expect(r.height.baseVal.value, 40); |
+ expect(r.width.baseVal.value, 130); |
+ expect(r.rx.baseVal.value, 5); |
+ }); |
+ |
+ test('trailing newline', () { |
+ // Ensures that we handle SVG with trailing newlines. |
+ var logo = new svg.SvgElement.svg(""" |
+ <svg xmlns='http://www.w3.org/2000/svg' version='1.1'> |
+ <path/> |
+ </svg> |
+ """); |
+ |
+ expect(logo, isSvgElement); |
+ |
+ }); |
+ }); |
+ |
+ group('svgInterfaceMatch', () { |
+ // Test that SVG elements explicitly implement the IDL interfaces (is-checks |
+ // only, see SVGTest3 for behavioural tests). |
+ insertTestDiv() { |
+ var element = new Element.tag('div'); |
+ element.innerHtml = r''' |
+<svg id='svg1' width='200' height='100'> |
+<rect id='rect1' x='10' y='20' width='130' height='40' rx='5'fill='blue'></rect> |
+</svg> |
+'''; |
+ document.body.nodes.add(element); |
+ return element; |
+ } |
+ |
+ |
+ var isElement = predicate((x) => x is Element, 'is an Element'); |
+ var isSvgElement = predicate((x) => x is svg.SvgElement, 'is a SvgElement'); |
+ var isSvgSvgElement = |
+ predicate((x) => x is svg.SvgSvgElement, 'is a SvgSvgElement'); |
+ var isNode = predicate((x) => x is Node, 'is a Node'); |
+ var isSvgTests = predicate((x) => x is svg.Tests, 'is a svg.Tests'); |
+ var isSvgLangSpace = predicate((x) => x is svg.LangSpace, 'is a svg.LangSpace'); |
+ var isSvgExternalResourcesRequired = |
+ predicate((x) => x is svg.ExternalResourcesRequired, |
+ 'is a svg.ExternalResourcesRequired'); |
+ var isSvgTransformable = |
+ predicate((x) => x is svg.Transformable, 'is a svg.Transformable'); |
+ var isSvgLocatable = |
+ predicate((x) => x is svg.Locatable, 'is a svg.Locatable'); |
+ var isSvgNumber = predicate((x) => x is svg.Number, 'is a svg.Number'); |
+ var isSvgRect = predicate((x) => x is svg.Rect, 'is a svg.Rect'); |
+ |
+ test('rect_isChecks', () { |
+ var div = insertTestDiv(); |
+ var r = document.query('#rect1'); |
+ |
+ // Direct inheritance chain |
+ expect(r, isSvgElement); |
+ expect(r, isElement); |
+ expect(r, isNode); |
+ |
+ // Other implemented interfaces. |
+ expect(r, isSvgTests); |
+ expect(r, isSvgLangSpace); |
+ expect(r, isSvgExternalResourcesRequired); |
+ expect(r, isSvgTransformable); |
+ expect(r, isSvgLocatable); |
+ |
+ // Interfaces not implemented. |
+ expect(r, isNot(isSvgNumber)); |
+ expect(r, isNot(isSvgRect)); |
+ expect(r, isNot(isSvgSvgElement)); |
+ |
+ div.remove(); |
+ }); |
+ }); |
+ |
+ insertTestDiv() { |
+ var element = new Element.tag('div'); |
+ element.innerHtml = r''' |
+<svg id='svg1' width='200' height='100'> |
+<rect id='rect1' x='10' y='20' width='130' height='40' rx='5'fill='blue'></rect> |
+</svg> |
+'''; |
+ document.body.nodes.add(element); |
+ return element; |
+ } |
+ |
+ group('supported_externalResourcesRequired', () { |
+ test('supported', () { |
+ var div = insertTestDiv(); |
+ var r = document.query('#rect1'); |
+ expect(svg.ExternalResourcesRequired.supported(r), true); |
+ div.remove(); |
+ }); |
+ }); |
+ |
+ group('supported_langSpace', () { |
+ test('supported', () { |
+ var div = insertTestDiv(); |
+ var r = document.query('#rect1'); |
+ expect(svg.LangSpace.supported(r), true); |
+ div.remove(); |
+ }); |
+ }); |
+ |
+ group('svgBehavioral', () { |
+ |
+ // Test that SVG elements have the operations advertised through all the IDL |
+ // interfaces. This is a 'duck typing' test, and does not explicitly use |
+ // 'is' checks on the expected interfaces (that is in the test group above). |
+ |
+ var isString = predicate((x) => x is String, 'is a String'); |
+ var isStringList = predicate((x) => x is List<String>, 'is a List<String>'); |
+ var isSvgMatrix = predicate((x) => x is svg.Matrix, 'is a svg.Matrix'); |
+ var isSvgAnimatedBoolean = |
+ predicate((x) => x is svg.AnimatedBoolean, 'is an svg.AnimatedBoolean'); |
+ var isSvgAnimatedString = |
+ predicate((x) => x is svg.AnimatedString, 'is an svg.AnimatedString'); |
+ var isSvgRect = predicate((x) => x is svg.Rect, 'is a svg.Rect'); |
+ var isSvgAnimatedTransformList = |
+ predicate((x) => x is svg.AnimatedTransformList, |
+ 'is an svg.AnimatedTransformList'); |
+ var isCssStyleDeclaration = |
+ predicate((x) => x is CssStyleDeclaration, 'is a CssStyleDeclaration'); |
+ var isCssValue = predicate((x) => x is CssValue, 'is a CssValue'); |
+ |
+ /// Verifies that [e] supports the operations on the svg.Tests interface. |
+ checkSvgTests(e) { |
+ // Just check that the operations seem to exist. |
+ var rx = e.requiredExtensions; |
+ expect(rx, isStringList); |
+ var rf = e.requiredFeatures; |
+ expect(rf, isStringList); |
+ var sl = e.systemLanguage; |
+ expect(sl, isStringList); |
+ |
+ bool hasDoDo = e.hasExtension("DoDo"); |
+ expect(hasDoDo, isFalse); |
+ } |
+ |
+ /// Verifies that [e] supports the operations on the svg.Locatable interface. |
+ checkSvgLocatable(e) { |
+ var v1 = e.farthestViewportElement; |
+ var v2 = e.nearestViewportElement; |
+ expect(v1, same(v2)); |
+ |
+ var bbox = e.getBBox(); |
+ expect(bbox, isSvgRect); |
+ |
+ var ctm = e.getCtm(); |
+ expect(ctm, isSvgMatrix); |
+ |
+ var sctm = e.getScreenCtm(); |
+ expect(sctm, isSvgMatrix); |
+ |
+ var xf2e = e.getTransformToElement(e); |
+ expect(xf2e, isSvgMatrix); |
+ } |
+ |
+ /** |
+ * Verifies that [e] supports the operations on the svg.Transformable |
+ * interface. |
+ */ |
+ checkSvgTransformable(e) { |
+ var trans = e.transform; |
+ expect(trans, isSvgAnimatedTransformList); |
+ } |
+ |
+ testRect(name, checker) { |
+ test(name, () { |
+ var div = insertTestDiv(); |
+ var r = document.query('#rect1'); |
+ checker(r); |
+ div.remove(); |
+ }); |
+ } |
+ |
+ /** |
+ * Verifies that [e] supports the operations on the svg.LangSpace interface. |
+ */ |
+ checkSvgLangSpace(e) { |
+ if (svg.LangSpace.supported(e)) { |
+ // Just check that the attributes seem to exist. |
+ var lang = e.xmllang; |
+ e.xmllang = lang; |
+ |
+ String space = e.xmlspace; |
+ e.xmlspace = space; |
+ |
+ expect(lang, isString); |
+ expect(space, isString); |
+ } |
+ } |
+ |
+ /** |
+ * Verifies that [e] supports the operations on the |
+ * svg.ExternalResourcesRequired interface. |
+ */ |
+ checkSvgExternalResourcesRequired(e) { |
+ if (svg.ExternalResourcesRequired.supported(e)) { |
+ var b = e.externalResourcesRequired; |
+ expect(b, isSvgAnimatedBoolean); |
+ expect(b.baseVal, isFalse); |
+ expect(b.animVal, isFalse); |
+ } |
+ } |
+ |
+ testRect('rect_SvgTests', checkSvgTests); |
+ testRect('rect_SvgLangSpace', checkSvgLangSpace); |
+ testRect('rect_SvgExternalResourcesRequired', |
+ checkSvgExternalResourcesRequired); |
+ testRect('rect_SvgLocatable', checkSvgLocatable); |
+ testRect('rect_SvgTransformable', checkSvgTransformable); |
+ }); |
+ |
+} |