| Index: test/codegen/lib/html/svgelement_test.dart
|
| diff --git a/test/codegen/lib/html/svgelement_test.dart b/test/codegen/lib/html/svgelement_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1fa725996ad1ed9f94e2484e4ba5739678b83a8f
|
| --- /dev/null
|
| +++ b/test/codegen/lib/html/svgelement_test.dart
|
| @@ -0,0 +1,474 @@
|
| +// Copyright (c) 2011, 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 SvgElementTest;
|
| +import 'dart:html';
|
| +import 'dart:svg' as svg;
|
| +import 'package:expect/expect.dart';
|
| +import 'package:unittest/html_individual_config.dart';
|
| +import 'package:unittest/unittest.dart';
|
| +
|
| +main() {
|
| + useHtmlIndividualConfiguration();
|
| +
|
| + var isSvgSvgElement =
|
| + predicate((x) => x is svg.SvgSvgElement, 'is a SvgSvgElement');
|
| +
|
| + List<String> _nodeStrings(Iterable<Node> input) {
|
| + final out = new List<String>();
|
| + for (Node n in input) {
|
| + if (n is Element) {
|
| + Element e = n;
|
| + out.add(e.tagName);
|
| + } else {
|
| + out.add(n.text);
|
| + }
|
| + }
|
| + return out;
|
| + };
|
| +
|
| + testConstructor(String tagName, Function isExpectedClass,
|
| + [bool expectation = true, allowsInnerHtml = true]) {
|
| + test(tagName, () {
|
| + expect(isExpectedClass(new svg.SvgElement.tag(tagName)), expectation);
|
| + if (allowsInnerHtml) {
|
| + expect(isExpectedClass(new svg.SvgElement.svg('<$tagName></$tagName>')),
|
| + expectation && allowsInnerHtml);
|
| + }
|
| + });
|
| + }
|
| + group('additionalConstructors', () {
|
| + test('valid', () {
|
| + final svgContent =
|
| + "<svg version=\"1.1\">\n"
|
| + " <circle></circle>\n"
|
| + " <path></path>\n"
|
| + "</svg>";
|
| + final el = new svg.SvgElement.svg(svgContent);
|
| + expect(el, isSvgSvgElement);
|
| + expect(el.innerHtml, anyOf("<circle></circle><path></path>", '<circle '
|
| + 'xmlns="http://www.w3.org/2000/svg" /><path '
|
| + 'xmlns="http://www.w3.org/2000/svg" />'));
|
| + expect(el.outerHtml, anyOf(svgContent,
|
| + '<svg xmlns="http://www.w3.org/2000/svg" version="1.1">\n '
|
| + '<circle />\n <path />\n</svg>'));
|
| + });
|
| +
|
| + test('has no parent', () =>
|
| + expect(new svg.SvgElement.svg('<circle/>').parent, isNull)
|
| + );
|
| +
|
| + test('empty', () {
|
| + expect(() => new svg.SvgElement.svg(""), throwsStateError);
|
| + });
|
| +
|
| + test('too many elements', () {
|
| + expect(() => new svg.SvgElement.svg("<circle></circle><path></path>"),
|
| + throwsStateError);
|
| + });
|
| + });
|
| +
|
| + // Unfortunately, because the filtering mechanism in unitttest is a regex done
|
| + group('supported_animate', () {
|
| + test('supported', () {
|
| + expect(svg.AnimateElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_animateMotion', () {
|
| + test('supported', () {
|
| + expect(svg.AnimateMotionElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_animateTransform', () {
|
| + test('supported', () {
|
| + expect(svg.AnimateTransformElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_feBlend', () {
|
| + test('supported', () {
|
| + expect(svg.FEBlendElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_feColorMatrix', () {
|
| + test('supported', () {
|
| + expect(svg.FEColorMatrixElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_feComponentTransfer', () {
|
| + test('supported', () {
|
| + expect(svg.FEComponentTransferElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_feConvolveMatrix', () {
|
| + test('supported', () {
|
| + expect(svg.FEConvolveMatrixElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_feDiffuseLighting', () {
|
| + test('supported', () {
|
| + expect(svg.FEDiffuseLightingElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_feDisplacementMap', () {
|
| + test('supported', () {
|
| + expect(svg.FEDisplacementMapElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_feDistantLight', () {
|
| + test('supported', () {
|
| + expect(svg.FEDistantLightElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_feFlood', () {
|
| + test('supported', () {
|
| + expect(svg.FEFloodElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_feFuncA', () {
|
| + test('supported', () {
|
| + expect(svg.FEFuncAElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_feFuncB', () {
|
| + test('supported', () {
|
| + expect(svg.FEFuncBElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_feFuncG', () {
|
| + test('supported', () {
|
| + expect(svg.FEFuncGElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_feFuncR', () {
|
| + test('supported', () {
|
| + expect(svg.FEFuncRElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_feGaussianBlur', () {
|
| + test('supported', () {
|
| + expect(svg.FEGaussianBlurElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_feImage', () {
|
| + test('supported', () {
|
| + expect(svg.FEImageElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_feMerge', () {
|
| + test('supported', () {
|
| + expect(svg.FEMergeElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_feMergeNode', () {
|
| + test('supported', () {
|
| + expect(svg.FEMergeNodeElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_feOffset', () {
|
| + test('supported', () {
|
| + expect(svg.FEOffsetElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_feComponentTransfer', () {
|
| + test('supported', () {
|
| + expect(svg.FEPointLightElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_feSpecularLighting', () {
|
| + test('supported', () {
|
| + expect(svg.FESpecularLightingElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_feComponentTransfer', () {
|
| + test('supported', () {
|
| + expect(svg.FESpotLightElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_feTile', () {
|
| + test('supported', () {
|
| + expect(svg.FETileElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_feTurbulence', () {
|
| + test('supported', () {
|
| + expect(svg.FETurbulenceElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_filter', () {
|
| + test('supported', () {
|
| + expect(svg.FilterElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_foreignObject', () {
|
| + test('supported', () {
|
| + expect(svg.ForeignObjectElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('supported_set', () {
|
| + test('supported', () {
|
| + expect(svg.SetElement.supported, true);
|
| + });
|
| + });
|
| +
|
| + group('constructors', () {
|
| + testConstructor('a', (e) => e is svg.AElement);
|
| + testConstructor('circle', (e) => e is svg.CircleElement);
|
| + testConstructor('clipPath', (e) => e is svg.ClipPathElement);
|
| + testConstructor('defs', (e) => e is svg.DefsElement);
|
| + testConstructor('desc', (e) => e is svg.DescElement);
|
| + testConstructor('ellipse', (e) => e is svg.EllipseElement);
|
| + testConstructor('g', (e) => e is svg.GElement);
|
| + testConstructor('image', (e) => e is svg.ImageElement);
|
| + testConstructor('line', (e) => e is svg.LineElement);
|
| + testConstructor('linearGradient', (e) => e is svg.LinearGradientElement);
|
| + testConstructor('marker', (e) => e is svg.MarkerElement);
|
| + testConstructor('mask', (e) => e is svg.MaskElement);
|
| + testConstructor('path', (e) => e is svg.PathElement);
|
| + testConstructor('pattern', (e) => e is svg.PatternElement);
|
| + testConstructor('polygon', (e) => e is svg.PolygonElement);
|
| + testConstructor('polyline', (e) => e is svg.PolylineElement);
|
| + testConstructor('radialGradient', (e) => e is svg.RadialGradientElement);
|
| + testConstructor('rect', (e) => e is svg.RectElement);
|
| + test('script', () {
|
| + expect(new svg.SvgElement.tag('script') is svg.ScriptElement, isTrue);
|
| + });
|
| + testConstructor('stop', (e) => e is svg.StopElement);
|
| + testConstructor('style', (e) => e is svg.StyleElement);
|
| + testConstructor('switch', (e) => e is svg.SwitchElement);
|
| + testConstructor('symbol', (e) => e is svg.SymbolElement);
|
| + testConstructor('tspan', (e) => e is svg.TSpanElement);
|
| + testConstructor('text', (e) => e is svg.TextElement);
|
| + testConstructor('textPath', (e) => e is svg.TextPathElement);
|
| + testConstructor('title', (e) => e is svg.TitleElement);
|
| + testConstructor('use', (e) => e is svg.UseElement);
|
| + testConstructor('view', (e) => e is svg.ViewElement);
|
| + // TODO(alanknight): Issue 23144
|
| + testConstructor('animate', (e) => e is svg.AnimateElement,
|
| + svg.AnimateElement.supported);
|
| + testConstructor('animateMotion', (e) => e is svg.AnimateMotionElement,
|
| + svg.AnimateMotionElement.supported);
|
| + testConstructor('animateTransform', (e) => e is svg.AnimateTransformElement,
|
| + svg.AnimateTransformElement.supported);
|
| + testConstructor('feBlend', (e) => e is svg.FEBlendElement,
|
| + svg.FEBlendElement.supported);
|
| + testConstructor('feColorMatrix', (e) => e is svg.FEColorMatrixElement,
|
| + svg.FEColorMatrixElement.supported);
|
| + testConstructor('feComponentTransfer',
|
| + (e) => e is svg.FEComponentTransferElement,
|
| + svg.FEComponentTransferElement.supported);
|
| + testConstructor('feConvolveMatrix',
|
| + (e) => e is svg.FEConvolveMatrixElement,
|
| + svg.FEConvolveMatrixElement.supported);
|
| + testConstructor('feDiffuseLighting',
|
| + (e) => e is svg.FEDiffuseLightingElement,
|
| + svg.FEDiffuseLightingElement.supported);
|
| + testConstructor('feDisplacementMap',
|
| + (e) => e is svg.FEDisplacementMapElement,
|
| + svg.FEDisplacementMapElement.supported);
|
| + testConstructor('feDistantLight', (e) => e is svg.FEDistantLightElement,
|
| + svg.FEDistantLightElement.supported);
|
| + testConstructor('feFlood', (e) => e is svg.FEFloodElement,
|
| + svg.FEFloodElement.supported);
|
| + testConstructor('feFuncA', (e) => e is svg.FEFuncAElement,
|
| + svg.FEFuncAElement.supported);
|
| + testConstructor('feFuncB', (e) => e is svg.FEFuncBElement,
|
| + svg.FEFuncBElement.supported);
|
| + testConstructor('feFuncG', (e) => e is svg.FEFuncGElement,
|
| + svg.FEFuncGElement.supported);
|
| + testConstructor('feFuncR', (e) => e is svg.FEFuncRElement,
|
| + svg.FEFuncRElement.supported);
|
| + testConstructor('feGaussianBlur', (e) => e is svg.FEGaussianBlurElement,
|
| + svg.FEGaussianBlurElement.supported);
|
| + testConstructor('feImage', (e) => e is svg.FEImageElement,
|
| + svg.FEImageElement.supported);
|
| + testConstructor('feMerge', (e) => e is svg.FEMergeElement,
|
| + svg.FEMergeElement.supported);
|
| + testConstructor('feMergeNode', (e) => e is svg.FEMergeNodeElement,
|
| + svg.FEMergeNodeElement.supported);
|
| + testConstructor('feOffset', (e) => e is svg.FEOffsetElement,
|
| + svg.FEOffsetElement.supported);
|
| + testConstructor('fePointLight', (e) => e is svg.FEPointLightElement,
|
| + svg.FEPointLightElement.supported);
|
| + testConstructor('feSpecularLighting',
|
| + (e) => e is svg.FESpecularLightingElement,
|
| + svg.FESpecularLightingElement.supported);
|
| + testConstructor('feSpotLight', (e) => e is svg.FESpotLightElement,
|
| + svg.FESpotLightElement.supported);
|
| + testConstructor('feTile', (e) => e is svg.FETileElement,
|
| + svg.FETileElement.supported);
|
| + testConstructor('feTurbulence', (e) => e is svg.FETurbulenceElement,
|
| + svg.FETurbulenceElement.supported);
|
| + testConstructor('filter', (e) => e is svg.FilterElement,
|
| + svg.FilterElement.supported);
|
| + testConstructor('foreignObject', (e) => e is svg.ForeignObjectElement,
|
| + svg.ForeignObjectElement.supported, false);
|
| + testConstructor('metadata', (e) => e is svg.MetadataElement);
|
| + testConstructor('set', (e) => e is svg.SetElement,
|
| + svg.SetElement.supported);
|
| + });
|
| +
|
| + group('outerHtml', () {
|
| + test('outerHtml', () {
|
| + final el = new svg.SvgSvgElement();
|
| + el.children.add(new svg.CircleElement());
|
| + el.children.add(new svg.PathElement());
|
| + expect([
|
| + '<svg version="1.1"><circle></circle><path></path></svg>',
|
| + '<svg xmlns="http://www.w3.org/2000/svg" version="1.1">'
|
| + '<circle /><path /></svg>',
|
| + ].contains(el.outerHtml), true);
|
| + });
|
| + });
|
| +
|
| + group('innerHtml', () {
|
| + test('get', () {
|
| + final el = new svg.SvgSvgElement();
|
| + el.children.add(new svg.CircleElement());
|
| + el.children.add(new svg.PathElement());
|
| + // Allow for odd IE serialization.
|
| + expect([
|
| + '<circle></circle><path></path>',
|
| + '<circle xmlns="http://www.w3.org/2000/svg" />'
|
| + '<path xmlns="http://www.w3.org/2000/svg" />'
|
| + ].contains(el.innerHtml), true);
|
| + });
|
| +
|
| + test('set', () {
|
| + final el = new svg.SvgSvgElement();
|
| + el.children.add(new svg.CircleElement());
|
| + el.children.add(new svg.PathElement());
|
| + el.innerHtml = '<rect></rect><a></a>';
|
| + expect(_nodeStrings(el.children), ["rect", "a"]);
|
| + });
|
| + });
|
| +
|
| + group('elementget', () {
|
| + test('get', () {
|
| + final el = new svg.SvgElement.svg("""
|
| +<svg version="1.1">
|
| + <circle></circle>
|
| + <path></path>
|
| + text
|
| +</svg>""");
|
| + expect(_nodeStrings(el.children), ["circle", "path"]);
|
| + });
|
| +
|
| + test('resize', () {
|
| + var el = new svg.SvgSvgElement();
|
| + var items = [new svg.CircleElement(), new svg.RectElement()];
|
| + el.children = items;
|
| + expect(el.children.length, 2);
|
| + el.children.length = 1;
|
| + expect(el.children.length, 1);
|
| + expect(el.children.contains(items[0]), true);
|
| + expect(el.children.contains(items[1]), false);
|
| +
|
| + el.children.length = 0;
|
| + expect(el.children.contains(items[0]), false);
|
| + });
|
| + });
|
| +
|
| + group('elementset', () {
|
| + test('set', () {
|
| + final el = new svg.SvgSvgElement();
|
| + el.children = [new svg.SvgElement.tag("circle"), new svg.SvgElement.tag("path")];
|
| + expect(el.nodes.length, 2);
|
| + expect(el.nodes[0] is svg.CircleElement, true);
|
| + expect(el.nodes[1] is svg.PathElement, true);
|
| + });
|
| + });
|
| +
|
| + group('css', () {
|
| + test('classes', () {
|
| + var el = new svg.CircleElement();
|
| + var classes = el.classes;
|
| + expect(el.classes.length, 0);
|
| + classes.toggle('foo');
|
| + expect(el.classes.length, 1);
|
| + classes.toggle('foo');
|
| + expect(el.classes.length, 0);
|
| + });
|
| +
|
| + test('classes-add-bad', () {
|
| + var el = new svg.CircleElement();
|
| + expect(() => el.classes.add(''), throws);
|
| + expect(() => el.classes.add('foo bar'), throws);
|
| + });
|
| + test('classes-remove-bad', () {
|
| + var el = new svg.CircleElement();
|
| + expect(() => el.classes.remove(''), throws);
|
| + expect(() => el.classes.remove('foo bar'), throws);
|
| + });
|
| + test('classes-toggle-token', () {
|
| + var el = new svg.CircleElement();
|
| + expect(() => el.classes.toggle(''), throws);
|
| + expect(() => el.classes.toggle('', true), throws);
|
| + expect(() => el.classes.toggle('', false), throws);
|
| + expect(() => el.classes.toggle('foo bar'), throws);
|
| + expect(() => el.classes.toggle('foo bar', true), throws);
|
| + expect(() => el.classes.toggle('foo bar', false), throws);
|
| + });
|
| + test('classes-contains-bad', () {
|
| + var el = new svg.CircleElement();
|
| + // Non-strings => false, strings must be valid tokens.
|
| + expect(el.classes.contains(1), isFalse);
|
| + expect(() => el.classes.contains(''), throws);
|
| + expect(() => el.classes.contains('foo bar'), throws);
|
| + });
|
| + });
|
| +
|
| + group('getBoundingClientRect', () {
|
| + test('is a Rectangle', () {
|
| + var element = new svg.RectElement();
|
| + element.attributes['width'] = '100';
|
| + element.attributes['height'] = '100';
|
| + var root = new svg.SvgSvgElement();
|
| + root.append(element);
|
| +
|
| + document.body.append(root);
|
| +
|
| + var rect = element.getBoundingClientRect();
|
| + expect(rect is Rectangle, isTrue);
|
| + expect(rect.width, closeTo(100, 1));
|
| + expect(rect.height, closeTo(100, 1));
|
| + });
|
| + });
|
| +
|
| + group('PathElement', () {
|
| + test('pathSegList', () {
|
| + svg.PathElement path =
|
| + new svg.SvgElement.svg('<path d="M 100 100 L 300 100 L 200 300 z"/>');
|
| + for (var seg in path.pathSegList) {
|
| + expect(seg is svg.PathSeg, isTrue);
|
| + }
|
| + });
|
| + });
|
| +}
|
|
|