blob: fecb2eed086f6c534c1bbae4833a2c31e1df089f [file] [log] [blame]
// 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.
import 'dart:html';
import 'dart:svg' as svg;
import 'package:expect/minitest.dart';
main() {
group('svgPresence', () {
var isSvgElement = predicate((x) => x is svg.SvgElement, 'is a SvgElement');
test('simpleRect', () {
var div = new Element.tag('div');
document.body!.append(div);
div.setInnerHtml(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>
''', validator: new NodeValidatorBuilder()..allowSvg());
var e = document.querySelector('#svg1');
expect(e, isNotNull);
svg.RectElement r = document.querySelector('#rect1') as svg.RectElement;
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.setInnerHtml(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>
''', validator: new NodeValidatorBuilder()..allowSvg());
document.body!.append(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 isNotSvgSvgElement =
predicate((x) => x is! svg.SvgSvgElement, 'is not a SvgSvgElement');
var isNode = predicate((x) => x is Node, 'is a Node');
var isSvgNumber = predicate((x) => x is svg.Number, 'is a svg.Number');
var isNotSvgNumber =
predicate((x) => x is! svg.Number, 'is not a svg.Number');
var isSvgRect = predicate((x) => x is svg.Rect, 'is a svg.Rect');
var isNotSvgRect = predicate((x) => x is! svg.Rect, 'is not a svg.Rect');
test('rect_isChecks', () {
var div = insertTestDiv();
var r = document.querySelector('#rect1');
// Direct inheritance chain
expect(r, isSvgElement);
expect(r, isElement);
expect(r, isNode);
// Interfaces not implemented.
expect(r, isNotSvgNumber);
expect(r, isNotSvgRect);
expect(r, isNotSvgSvgElement);
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!.append(element);
return element;
}
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');
testRect(name, checker) {
test(name, () {
var div = insertTestDiv();
var r = document.querySelector('#rect1');
checker(r);
div.remove();
});
}
});
}