Chromium Code Reviews| 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..7673f16fd33a9b37ebda58c1d974923b80fb55b7 |
| --- /dev/null |
| +++ b/tests/html/svg_test.dart |
| @@ -0,0 +1,270 @@ |
| +// 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(); |
|
Emily Fortuna
2013/01/24 21:55:17
now that we have browser "multitests" (able to bre
|
| + |
| + 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 isSvgStylable = predicate((x) => x is svg.Stylable, 'is a svg.Stylable'); |
| + 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, isSvgStylable); |
| + 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); |
|
blois
2013/01/24 23:20:47
Ditto.
|
| + div.remove(); |
| + }); |
| + }); |
| + |
| + group('supported_langSpace', () { |
| + test('supported', () { |
| + var div = insertTestDiv(); |
| + var r = document.query('#rect1'); |
| + expect(svg.LangSpace.supported(r), true); |
|
blois
2013/01/24 23:20:47
This doesn't appear to match the syntax in the gen
|
| + div.remove(); |
| + }); |
| + }); |
| + |
| + group('supported_stylable', () { |
| + test('supported', () { |
| + var div = insertTestDiv(); |
| + var r = document.query('#rect1'); |
| + expect(svg.Stylable.supported(r), true); |
|
blois
2013/01/24 23:20:47
Ditto.
|
| + 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.Stylable interface. |
| + checkSvgStylable(e) { |
| + if (svg.Stylable.supported(e)) { |
| + var s = e.style; |
| + expect(s, isCssStyleDeclaration); |
| + |
| + var attributeA = e.getPresentationAttribute('A'); |
| + expect(attributeA, anyOf(isNull, isCssValue)); |
| + } |
| + } |
| + |
| + /// 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_SvgStylable', checkSvgStylable); |
| + testRect('rect_SvgLocatable', checkSvgLocatable); |
| + testRect('rect_SvgTransformable', checkSvgTransformable); |
| + }); |
| + |
| +} |