From 765763c5def0296808f6876bab5610a3a79629c7 Mon Sep 17 00:00:00 2001 From: Mathias Amnell <104110+Amnell@users.noreply.github.com> Date: Sat, 23 May 2026 17:19:13 +0200 Subject: [PATCH 01/19] Fix race condition when parsing in parallell --- Source/Parser/SVG/SVGConstants.swift | 59 +++++----------------------- 1 file changed, 9 insertions(+), 50 deletions(-) diff --git a/Source/Parser/SVG/SVGConstants.swift b/Source/Parser/SVG/SVGConstants.swift index c957a044..87d9b9be 100644 --- a/Source/Parser/SVG/SVGConstants.swift +++ b/Source/Parser/SVG/SVGConstants.swift @@ -39,70 +39,29 @@ open class SVGConstants { public class SVGParserRegexHelper { - fileprivate static let transformAttributePattern = "([a-z]+)\\(((\\-?\\d+\\.?\\d*e?\\-?\\d*\\s*,?\\s*)+)\\)" - fileprivate static let transformPattern = "\\-?\\d+\\.?\\d*e?\\-?\\d*" - fileprivate static let textElementPattern = "((?s:.*))<\\/text>" - fileprivate static let maskIdenitifierPattern = "url\\(#((?s:.*))\\)" - fileprivate static let unitsIdenitifierPattern = "([a-zA-Z]+)$" - - fileprivate static var transformMatcher: NSRegularExpression? - fileprivate static var transformAttributeMatcher: NSRegularExpression? - fileprivate static var textElementMatcher: NSRegularExpression? - fileprivate static var maskIdenitifierMatcher: NSRegularExpression? - fileprivate static var unitsMatcher: NSRegularExpression? + static let transformAttributeMatcher = try? NSRegularExpression(pattern: "([a-z]+)\\(((\\-?\\d+\\.?\\d*e?\\-?\\d*\\s*,?\\s*)+)\\)", options: .caseInsensitive) + static let transformMatcher = try? NSRegularExpression(pattern: "\\-?\\d+\\.?\\d*e?\\-?\\d*", options: .caseInsensitive) + static let textElementMatcher = try? NSRegularExpression(pattern: "((?s:.*))<\\/text>", options: .caseInsensitive) + static let maskIdenitifierMatcher = try? NSRegularExpression(pattern: "url\\(#((?s:.*))\\)", options: .caseInsensitive) + static let unitsMatcher = try? NSRegularExpression(pattern: "([a-zA-Z]+)$", options: .caseInsensitive) class func getTransformAttributeMatcher() -> NSRegularExpression? { - if self.transformAttributeMatcher == nil { - do { - self.transformAttributeMatcher = try NSRegularExpression(pattern: transformAttributePattern, options: .caseInsensitive) - } catch { - - } - } - return self.transformAttributeMatcher + return transformAttributeMatcher } class func getTransformMatcher() -> NSRegularExpression? { - if self.transformMatcher == nil { - do { - self.transformMatcher = try NSRegularExpression(pattern: transformPattern, options: .caseInsensitive) - } catch { - - } - } - return self.transformMatcher + return transformMatcher } class func getTextElementMatcher() -> NSRegularExpression? { - if self.textElementMatcher == nil { - do { - self.textElementMatcher = try NSRegularExpression(pattern: textElementPattern, options: .caseInsensitive) - } catch { - - } - } - return self.textElementMatcher + return textElementMatcher } class func getMaskIdenitifierMatcher() -> NSRegularExpression? { - if self.maskIdenitifierMatcher == nil { - do { - self.maskIdenitifierMatcher = try NSRegularExpression(pattern: maskIdenitifierPattern, options: .caseInsensitive) - } catch { - - } - } - return self.maskIdenitifierMatcher + return maskIdenitifierMatcher } class func getUnitsIdenitifierMatcher() -> NSRegularExpression? { - if unitsMatcher == nil { - do { - unitsMatcher = try NSRegularExpression(pattern: unitsIdenitifierPattern, options: .caseInsensitive) - } catch { - - } - } return unitsMatcher } From 99a9e4dcd9d340d2f8f94758391c51b283381ea4 Mon Sep 17 00:00:00 2001 From: Mathias Amnell <104110+Amnell@users.noreply.github.com> Date: Sat, 23 May 2026 17:20:37 +0200 Subject: [PATCH 02/19] Increase tools version in preparation for swift 6 --- Package.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Package.swift b/Package.swift index 75d314c4..9a9e14e6 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.9 +// swift-tools-version:6.3 import PackageDescription @@ -36,7 +36,7 @@ let package = Package( ), .target( name: "SVGView", - path: "Source" + path: "Source", ), .testTarget( name: "CoreGraphicsPolyfillTests", @@ -50,5 +50,5 @@ let package = Package( ] ), ], - swiftLanguageVersions: [.v5] + swiftLanguageModes: [.v5] ) From 9addb68ec63e33f741753274139f58b3c2a9ce1d Mon Sep 17 00:00:00 2001 From: Mathias Amnell <104110+Amnell@users.noreply.github.com> Date: Sat, 23 May 2026 17:20:59 +0200 Subject: [PATCH 03/19] Convert tests to swift testing --- .../PolyfillTests.swift | 375 ++++++++-------- Tests/SVGViewTests/BaseTestCase.swift | 44 +- Tests/SVGViewTests/CGTests.swift | 14 +- Tests/SVGViewTests/SVG11Tests.swift | 416 +++++++++--------- Tests/SVGViewTests/SVG12Tests.swift | 120 ++--- Tests/SVGViewTests/SVGCustomTests.swift | 20 +- 6 files changed, 488 insertions(+), 501 deletions(-) diff --git a/Tests/CoreGraphicsPolyfillTests/PolyfillTests.swift b/Tests/CoreGraphicsPolyfillTests/PolyfillTests.swift index 86555c99..fdf69f1f 100644 --- a/Tests/CoreGraphicsPolyfillTests/PolyfillTests.swift +++ b/Tests/CoreGraphicsPolyfillTests/PolyfillTests.swift @@ -16,127 +16,127 @@ // since the polyfill types are aliases to the native CoreGraphics types. // -import XCTest +import Testing @testable import SVGView -final class PolyfillTests: XCTestCase { +struct PolyfillTests { #if os(WASI) || os(Linux) // MARK: - CGAffineTransform Tests - func testAffineTransformIdentity() { + @Test func affineTransformIdentity() { let identity = CGAffineTransform.identity - XCTAssertEqual(identity.a, 1) - XCTAssertEqual(identity.b, 0) - XCTAssertEqual(identity.c, 0) - XCTAssertEqual(identity.d, 1) - XCTAssertEqual(identity.tx, 0) - XCTAssertEqual(identity.ty, 0) - XCTAssertTrue(identity.isIdentity) + #expect(identity.a == 1) + #expect(identity.b == 0) + #expect(identity.c == 0) + #expect(identity.d == 1) + #expect(identity.tx == 0) + #expect(identity.ty == 0) + #expect(identity.isIdentity) } - func testAffineTransformTranslation() { + @Test func affineTransformTranslation() { let transform = CGAffineTransform(translationX: 10, y: 20) - XCTAssertEqual(transform.a, 1) - XCTAssertEqual(transform.b, 0) - XCTAssertEqual(transform.c, 0) - XCTAssertEqual(transform.d, 1) - XCTAssertEqual(transform.tx, 10) - XCTAssertEqual(transform.ty, 20) - XCTAssertFalse(transform.isIdentity) + #expect(transform.a == 1) + #expect(transform.b == 0) + #expect(transform.c == 0) + #expect(transform.d == 1) + #expect(transform.tx == 10) + #expect(transform.ty == 20) + #expect(!transform.isIdentity) } - func testAffineTransformScale() { + @Test func affineTransformScale() { let transform = CGAffineTransform(scaleX: 2, y: 3) - XCTAssertEqual(transform.a, 2) - XCTAssertEqual(transform.b, 0) - XCTAssertEqual(transform.c, 0) - XCTAssertEqual(transform.d, 3) - XCTAssertEqual(transform.tx, 0) - XCTAssertEqual(transform.ty, 0) + #expect(transform.a == 2) + #expect(transform.b == 0) + #expect(transform.c == 0) + #expect(transform.d == 3) + #expect(transform.tx == 0) + #expect(transform.ty == 0) } - func testAffineTransformRotation() { + @Test func affineTransformRotation() { let transform = CGAffineTransform(rotationAngle: .pi / 2) - XCTAssertEqual(transform.a, cos(.pi / 2), accuracy: 1e-10) - XCTAssertEqual(transform.b, sin(.pi / 2), accuracy: 1e-10) - XCTAssertEqual(transform.c, -sin(.pi / 2), accuracy: 1e-10) - XCTAssertEqual(transform.d, cos(.pi / 2), accuracy: 1e-10) - XCTAssertEqual(transform.tx, 0) - XCTAssertEqual(transform.ty, 0) + #expect(abs(transform.a - cos(.pi / 2)) <= 1e-10) + #expect(abs(transform.b - sin(.pi / 2)) <= 1e-10) + #expect(abs(transform.c - (-sin(.pi / 2))) <= 1e-10) + #expect(abs(transform.d - cos(.pi / 2)) <= 1e-10) + #expect(transform.tx == 0) + #expect(transform.ty == 0) } - func testPointTransformation() { + @Test func pointTransformation() { let point = CGPoint(x: 1, y: 2) let transform = CGAffineTransform(translationX: 10, y: 20) let transformedPoint = point.applying(transform) - XCTAssertEqual(transformedPoint.x, 11) - XCTAssertEqual(transformedPoint.y, 22) + #expect(transformedPoint.x == 11) + #expect(transformedPoint.y == 22) } - func testTransformConcatenation() { + @Test func transformConcatenation() { let transform1 = CGAffineTransform(translationX: 5, y: 10) let transform2 = CGAffineTransform(scaleX: 2, y: 3) let combined = transform1.concatenating(transform2) - XCTAssertEqual(combined.a, 2) - XCTAssertEqual(combined.d, 3) - XCTAssertEqual(combined.tx, 10) - XCTAssertEqual(combined.ty, 30) + #expect(combined.a == 2) + #expect(combined.d == 3) + #expect(combined.tx == 10) + #expect(combined.ty == 30) } - func testTransformFluent() { + @Test func transformFluent() { let transform = CGAffineTransform.identity .translatedBy(x: 10, y: 20) .scaledBy(x: 2, y: 3) .rotated(by: .pi / 4) - XCTAssertFalse(transform.isIdentity) - XCTAssertNotEqual(transform.tx, 0) - XCTAssertNotEqual(transform.ty, 0) + #expect(!transform.isIdentity) + #expect(transform.tx != 0) + #expect(transform.ty != 0) } - func testComplexTransform() { + @Test func complexTransform() { let point = CGPoint(x: 5, y: 5) let transform = CGAffineTransform(rotationAngle: .pi / 4) .translatedBy(x: 10, y: 10) .scaledBy(x: 2, y: 2) let transformedPoint = point.applying(transform) - XCTAssertNotEqual(transformedPoint.x, point.x) - XCTAssertNotEqual(transformedPoint.y, point.y) + #expect(transformedPoint.x != point.x) + #expect(transformedPoint.y != point.y) } // MARK: - CGLineJoin and CGLineCap Tests - func testLineJoinEnum() { + @Test func lineJoinEnum() { let miterJoin = CGLineJoin.miter let roundJoin = CGLineJoin.round let bevelJoin = CGLineJoin.bevel let defaultJoin = CGLineJoin() - XCTAssertEqual(defaultJoin, .miter) - XCTAssertNotEqual(miterJoin, roundJoin) - XCTAssertNotEqual(roundJoin, bevelJoin) + #expect(defaultJoin == .miter) + #expect(miterJoin != roundJoin) + #expect(roundJoin != bevelJoin) } - func testLineCapEnum() { + @Test func lineCapEnum() { let buttCap = CGLineCap.butt let roundCap = CGLineCap.round let squareCap = CGLineCap.square let defaultCap = CGLineCap() - XCTAssertEqual(defaultCap, .butt) - XCTAssertNotEqual(buttCap, roundCap) - XCTAssertNotEqual(roundCap, squareCap) + #expect(defaultCap == .butt) + #expect(buttCap != roundCap) + #expect(roundCap != squareCap) } // MARK: - CGPath Tests - func testPathElementCreation() { + @Test func pathElementCreation() { let moveElement = PathElement.moveToPoint(CGPoint(x: 0, y: 0)) let lineElement = PathElement.addLineToPoint(CGPoint(x: 10, y: 10)) let _ = PathElement.addQuadCurveToPoint(CGPoint(x: 5, y: 5), CGPoint(x: 10, y: 0)) @@ -144,136 +144,136 @@ final class PolyfillTests: XCTestCase { let closeElement = PathElement.closeSubpath if case .moveToPoint(let point) = moveElement { - XCTAssertEqual(point.x, 0) - XCTAssertEqual(point.y, 0) + #expect(point.x == 0) + #expect(point.y == 0) } else { - XCTFail("Expected moveToPoint") + Issue.record("Expected moveToPoint") } if case .addLineToPoint(let point) = lineElement { - XCTAssertEqual(point.x, 10) - XCTAssertEqual(point.y, 10) + #expect(point.x == 10) + #expect(point.y == 10) } else { - XCTFail("Expected addLineToPoint") + Issue.record("Expected addLineToPoint") } if case .closeSubpath = closeElement { // Test passes } else { - XCTFail("Expected closeSubpath") + Issue.record("Expected closeSubpath") } } - func testPathBasicOperations() { + @Test func pathBasicOperations() { let path = CGPath() - XCTAssertTrue(path.elements.isEmpty) + #expect(path.elements.isEmpty) path.move(to: CGPoint(x: 0, y: 0)) - XCTAssertEqual(path.elements.count, 1) + #expect(path.elements.count == 1) path.addLine(to: CGPoint(x: 10, y: 10)) - XCTAssertEqual(path.elements.count, 2) + #expect(path.elements.count == 2) path.closeSubpath() - XCTAssertEqual(path.elements.count, 3) + #expect(path.elements.count == 3) } - func testPathBoundingBox() { + @Test func pathBoundingBox() { let path = CGPath() path.move(to: CGPoint(x: 5, y: 5)) path.addLine(to: CGPoint(x: 15, y: 10)) path.addLine(to: CGPoint(x: 10, y: 20)) let bounds = path.boundingBoxOfPath - XCTAssertEqual(bounds.minX, 5) - XCTAssertEqual(bounds.minY, 5) - XCTAssertEqual(bounds.maxX, 15) - XCTAssertEqual(bounds.maxY, 20) - XCTAssertEqual(bounds.width, 10) - XCTAssertEqual(bounds.height, 15) + #expect(bounds.minX == 5) + #expect(bounds.minY == 5) + #expect(bounds.maxX == 15) + #expect(bounds.maxY == 20) + #expect(bounds.width == 10) + #expect(bounds.height == 15) } - func testPathBoundingBoxWithCurves() { + @Test func pathBoundingBoxWithCurves() { let path = CGPath() path.move(to: CGPoint(x: 0, y: 0)) path.addCurve(to: CGPoint(x: 10, y: 10), control1: CGPoint(x: 5, y: 5), control2: CGPoint(x: 15, y: 8)) let bounds = path.boundingBoxOfPath - XCTAssertEqual(bounds.minX, 0) - XCTAssertEqual(bounds.minY, 0) - XCTAssertEqual(bounds.maxX, 15) - XCTAssertEqual(bounds.maxY, 10) + #expect(bounds.minX == 0) + #expect(bounds.minY == 0) + #expect(bounds.maxX == 15) + #expect(bounds.maxY == 10) } - func testPathAddRect() { + @Test func pathAddRect() { let path = CGPath() let rect = CGRect(x: 10, y: 20, width: 30, height: 40) path.addRect(rect) - XCTAssertEqual(path.elements.count, 5) // move + 3 lines + close + #expect(path.elements.count == 5) // move + 3 lines + close let bounds = path.boundingBoxOfPath - XCTAssertEqual(bounds, rect) + #expect(bounds == rect) } - func testPathAddEllipse() { + @Test func pathAddEllipse() { let path = CGPath() let rect = CGRect(x: 0, y: 0, width: 100, height: 50) path.addEllipse(in: rect) - XCTAssertFalse(path.elements.isEmpty) + #expect(!path.elements.isEmpty) let bounds = path.boundingBoxOfPath // Ellipse should fit within the rectangle (approximately) - XCTAssertGreaterThanOrEqual(bounds.minX, rect.minX - 1) - XCTAssertGreaterThanOrEqual(bounds.minY, rect.minY - 1) - XCTAssertLessThanOrEqual(bounds.maxX, rect.maxX + 1) - XCTAssertLessThanOrEqual(bounds.maxY, rect.maxY + 1) + #expect(bounds.minX >= rect.minX - 1) + #expect(bounds.minY >= rect.minY - 1) + #expect(bounds.maxX <= rect.maxX + 1) + #expect(bounds.maxY <= rect.maxY + 1) } - func testPathQuadCurve() { + @Test func pathQuadCurve() { let path = CGPath() path.move(to: CGPoint(x: 0, y: 0)) path.addQuadCurve(to: CGPoint(x: 10, y: 10), control: CGPoint(x: 5, y: 0)) - XCTAssertEqual(path.elements.count, 2) + #expect(path.elements.count == 2) if case .addQuadCurveToPoint(let control, let end) = path.elements[1] { - XCTAssertEqual(control.x, 5) - XCTAssertEqual(control.y, 0) - XCTAssertEqual(end.x, 10) - XCTAssertEqual(end.y, 10) + #expect(control.x == 5) + #expect(control.y == 0) + #expect(end.x == 10) + #expect(end.y == 10) } else { - XCTFail("Expected quad curve element") + Issue.record("Expected quad curve element") } } // MARK: - MBezierPath Tests - func testBezierPathInit() { + @Test func bezierPathInit() { let path = MBezierPath() - XCTAssertTrue(path.isEmpty) - XCTAssertTrue(path.cgPath.elements.isEmpty) + #expect(path.isEmpty) + #expect(path.cgPath.elements.isEmpty) } - func testBezierPathRectInit() { + @Test func bezierPathRectInit() { let rect = CGRect(x: 10, y: 20, width: 30, height: 40) let path = MBezierPath(rect: rect) - XCTAssertNotNil(path) - XCTAssertFalse(path!.isEmpty) - XCTAssertEqual(path!.bounds, rect) + #expect(path != nil) + #expect(!path!.isEmpty) + #expect(path!.bounds == rect) } - func testBezierPathOvalInit() { + @Test func bezierPathOvalInit() { let rect = CGRect(x: 0, y: 0, width: 100, height: 100) let path = MBezierPath(ovalIn: rect) - XCTAssertNotNil(path) - XCTAssertFalse(path!.isEmpty) + #expect(path != nil) + #expect(!path!.isEmpty) } - func testBezierPathArcInit() { + @Test func bezierPathArcInit() { let center = CGPoint(x: 50, y: 50) let radius: CGFloat = 25 let path = MBezierPath( @@ -284,14 +284,14 @@ final class PolyfillTests: XCTestCase { clockwise: true ) - XCTAssertFalse(path.isEmpty) + #expect(!path.isEmpty) } - func testBezierPathOperations() { + @Test func bezierPathOperations() { let path = MBezierPath() path.move(to: CGPoint(x: 0, y: 0)) - XCTAssertFalse(path.isEmpty) + #expect(!path.isEmpty) path.addLine(to: CGPoint(x: 10, y: 10)) path.addQuadCurve(to: CGPoint(x: 20, y: 0), controlPoint: CGPoint(x: 15, y: -5)) @@ -302,10 +302,10 @@ final class PolyfillTests: XCTestCase { ) path.close() - XCTAssertEqual(path.cgPath.elements.count, 5) + #expect(path.cgPath.elements.count == 5) } - func testBezierPathTransform() { + @Test func bezierPathTransform() { let path = MBezierPath() path.move(to: CGPoint(x: 0, y: 0)) path.addLine(to: CGPoint(x: 10, y: 10)) @@ -315,11 +315,11 @@ final class PolyfillTests: XCTestCase { path.apply(transform) let newBounds = path.bounds - XCTAssertEqual(newBounds.width, originalBounds.width * 2, accuracy: 1e-10) - XCTAssertEqual(newBounds.height, originalBounds.height * 2, accuracy: 1e-10) + #expect(abs(newBounds.width - originalBounds.width * 2) <= 1e-10) + #expect(abs(newBounds.height - originalBounds.height * 2) <= 1e-10) } - func testBezierPathAppend() { + @Test func bezierPathAppend() { let path1 = MBezierPath() path1.move(to: CGPoint(x: 0, y: 0)) path1.addLine(to: CGPoint(x: 10, y: 10)) @@ -331,10 +331,10 @@ final class PolyfillTests: XCTestCase { let originalCount = path1.cgPath.elements.count path1.append(path2) - XCTAssertEqual(path1.cgPath.elements.count, originalCount + path2.cgPath.elements.count) + #expect(path1.cgPath.elements.count == originalCount + path2.cgPath.elements.count) } - func testBezierPathArc() { + @Test func bezierPathArc() { let path = MBezierPath() let center = CGPoint(x: 50, y: 50) let radius: CGFloat = 25 @@ -347,11 +347,11 @@ final class PolyfillTests: XCTestCase { clockwise: true ) - XCTAssertFalse(path.isEmpty) - XCTAssertGreaterThan(path.cgPath.elements.count, 1) + #expect(!path.isEmpty) + #expect(path.cgPath.elements.count > 1) } - func testBezierPathArcCounterClockwise() { + @Test func bezierPathArcCounterClockwise() { let path = MBezierPath() let center = CGPoint(x: 0, y: 0) let radius: CGFloat = 10 @@ -364,10 +364,10 @@ final class PolyfillTests: XCTestCase { clockwise: false ) - XCTAssertFalse(path.isEmpty) + #expect(!path.isEmpty) } - func testBezierPathFullCircleArc() { + @Test func bezierPathFullCircleArc() { let path = MBezierPath() let center = CGPoint(x: 50, y: 50) let radius: CGFloat = 25 @@ -380,53 +380,53 @@ final class PolyfillTests: XCTestCase { clockwise: true ) - XCTAssertFalse(path.isEmpty) - XCTAssertGreaterThan(path.cgPath.elements.count, 4) // Should have multiple segments + #expect(!path.isEmpty) + #expect(path.cgPath.elements.count > 4) // Should have multiple segments } // MARK: - PathElement Extension Tests - func testPathElementLastPoint() { + @Test func pathElementLastPoint() { let moveElement = PathElement.moveToPoint(CGPoint(x: 5, y: 10)) let lineElement = PathElement.addLineToPoint(CGPoint(x: 15, y: 20)) let closeElement = PathElement.closeSubpath - XCTAssertEqual(moveElement.lastPoint, CGPoint(x: 5, y: 10)) - XCTAssertEqual(lineElement.lastPoint, CGPoint(x: 15, y: 20)) - XCTAssertNil(closeElement.lastPoint) + #expect(moveElement.lastPoint == CGPoint(x: 5, y: 10)) + #expect(lineElement.lastPoint == CGPoint(x: 15, y: 20)) + #expect(closeElement.lastPoint == nil) } - func testPathElementIsCloseSubpath() { + @Test func pathElementIsCloseSubpath() { let moveElement = PathElement.moveToPoint(CGPoint(x: 0, y: 0)) let closeElement = PathElement.closeSubpath - XCTAssertFalse(moveElement.isCloseSubpath) - XCTAssertTrue(closeElement.isCloseSubpath) + #expect(!moveElement.isCloseSubpath) + #expect(closeElement.isCloseSubpath) } - func testPathElementLastPointWithCurves() { + @Test func pathElementLastPointWithCurves() { let quadElement = PathElement.addQuadCurveToPoint(CGPoint(x: 5, y: 5), CGPoint(x: 10, y: 10)) let curveElement = PathElement.addCurveToPoint(CGPoint(x: 1, y: 1), CGPoint(x: 2, y: 2), CGPoint(x: 3, y: 3)) - XCTAssertEqual(quadElement.lastPoint, CGPoint(x: 10, y: 10)) - XCTAssertEqual(curveElement.lastPoint, CGPoint(x: 3, y: 3)) + #expect(quadElement.lastPoint == CGPoint(x: 10, y: 10)) + #expect(curveElement.lastPoint == CGPoint(x: 3, y: 3)) } // MARK: - CGPathElement Tests - func testCGPathElementCreation() { + @Test func cgPathElementCreation() { let element = CGPathElement( type: .moveToPoint, points: (CGPoint(x: 1, y: 2), CGPoint.zero, CGPoint.zero) ) - XCTAssertEqual(element.type, .moveToPoint) - XCTAssertEqual(element.points[0], CGPoint(x: 1, y: 2)) + #expect(element.type == .moveToPoint) + #expect(element.points[0] == CGPoint(x: 1, y: 2)) } // MARK: - CGPathElementType Tests - func testCGPathElementTypeEnum() { + @Test func cgPathElementTypeEnum() { let moveType = CGPathElementType.moveToPoint let lineType = CGPathElementType.addLineToPoint let quadType = CGPathElementType.addQuadCurveToPoint @@ -434,37 +434,37 @@ final class PolyfillTests: XCTestCase { let closeType = CGPathElementType.closeSubpath // Ensure all enum cases are distinct - XCTAssertNotEqual(moveType, lineType) - XCTAssertNotEqual(lineType, quadType) - XCTAssertNotEqual(quadType, curveType) - XCTAssertNotEqual(curveType, closeType) - XCTAssertNotEqual(closeType, moveType) + #expect(moveType != lineType) + #expect(lineType != quadType) + #expect(quadType != curveType) + #expect(curveType != closeType) + #expect(closeType != moveType) } // MARK: - CGPathFillRule Tests - func testCGPathFillRuleEnum() { + @Test func cgPathFillRuleEnum() { let evenOdd = CGPathFillRule.evenOdd let winding = CGPathFillRule.winding - XCTAssertNotEqual(evenOdd, winding) - XCTAssertNotEqual(evenOdd.rawValue, winding.rawValue) + #expect(evenOdd != winding) + #expect(evenOdd.rawValue != winding.rawValue) } - func testCGPathFillRuleRawValues() { + @Test func cgPathFillRuleRawValues() { // Test that raw values are distinct and valid let evenOdd = CGPathFillRule.evenOdd let winding = CGPathFillRule.winding - XCTAssertNotNil(CGPathFillRule(rawValue: evenOdd.rawValue)) - XCTAssertNotNil(CGPathFillRule(rawValue: winding.rawValue)) - XCTAssertEqual(CGPathFillRule(rawValue: evenOdd.rawValue), evenOdd) - XCTAssertEqual(CGPathFillRule(rawValue: winding.rawValue), winding) + #expect(CGPathFillRule(rawValue: evenOdd.rawValue) != nil) + #expect(CGPathFillRule(rawValue: winding.rawValue) != nil) + #expect(CGPathFillRule(rawValue: evenOdd.rawValue) == evenOdd) + #expect(CGPathFillRule(rawValue: winding.rawValue) == winding) } // MARK: - MBezierPath Static Method Tests - func testMBezierPathAddArcToStatic() { + @Test func mBezierPathAddArcToStatic() { let path = CGPath() let center = CGPoint(x: 10, y: 10) let radius: CGFloat = 5 @@ -479,19 +479,19 @@ final class PolyfillTests: XCTestCase { clockwise: true ) - XCTAssertFalse(path.elements.isEmpty) - XCTAssertGreaterThan(path.elements.count, 1) + #expect(!path.elements.isEmpty) + #expect(path.elements.count > 1) // First element should be move to starting point if case .moveToPoint(let point) = path.elements.first { - XCTAssertEqual(point.x, center.x + radius, accuracy: 1e-10) - XCTAssertEqual(point.y, center.y, accuracy: 1e-10) + #expect(abs(point.x - (center.x + radius)) <= 1e-10) + #expect(abs(point.y - center.y) <= 1e-10) } else { - XCTFail("Expected first element to be moveToPoint") + Issue.record("Expected first element to be moveToPoint") } } - func testMBezierPathAddArcToStaticWithExistingPath() { + @Test func mBezierPathAddArcToStaticWithExistingPath() { let path = CGPath() path.move(to: CGPoint(x: 20, y: 20)) path.addLine(to: CGPoint(x: 25, y: 25)) @@ -509,31 +509,31 @@ final class PolyfillTests: XCTestCase { ) // Should have added more elements - XCTAssertGreaterThan(path.elements.count, originalCount) + #expect(path.elements.count > originalCount) } // MARK: - Edge Cases - func testEmptyPathBounds() { + @Test func emptyPathBounds() { let path = CGPath() let bounds = path.boundingBoxOfPath - XCTAssertTrue(bounds.width.isInfinite || bounds.width.isNaN) - XCTAssertTrue(bounds.height.isInfinite || bounds.height.isNaN) + #expect(bounds.width.isInfinite || bounds.width.isNaN) + #expect(bounds.height.isInfinite || bounds.height.isNaN) } - func testSinglePointPathBounds() { + @Test func singlePointPathBounds() { let path = CGPath() path.move(to: CGPoint(x: 10, y: 20)) let bounds = path.boundingBoxOfPath - XCTAssertEqual(bounds.origin.x, 10) - XCTAssertEqual(bounds.origin.y, 20) - XCTAssertEqual(bounds.width, 0) - XCTAssertEqual(bounds.height, 0) + #expect(bounds.origin.x == 10) + #expect(bounds.origin.y == 20) + #expect(bounds.width == 0) + #expect(bounds.height == 0) } - func testZeroRadiusArc() { + @Test func zeroRadiusArc() { let path = MBezierPath() path.addArc( withCenter: CGPoint(x: 0, y: 0), @@ -544,33 +544,33 @@ final class PolyfillTests: XCTestCase { ) // With zero radius, it creates move + curve elements all at center point - XCTAssertFalse(path.isEmpty) - XCTAssertEqual(path.cgPath.elements.count, 3) // move + 2 curves for π angle + #expect(!path.isEmpty) + #expect(path.cgPath.elements.count == 3) // move + 2 curves for pi angle // First element should be moveToPoint at center if case .moveToPoint(let point) = path.cgPath.elements[0] { - XCTAssertEqual(point.x, 0) - XCTAssertEqual(point.y, 0) + #expect(point.x == 0) + #expect(point.y == 0) } else { - XCTFail("Expected first element to be moveToPoint") + Issue.record("Expected first element to be moveToPoint") } // All curve elements should have all points at center for element in path.cgPath.elements.dropFirst() { if case .addCurveToPoint(let cp1, let cp2, let end) = element { - XCTAssertEqual(cp1.x, 0) - XCTAssertEqual(cp1.y, 0) - XCTAssertEqual(cp2.x, 0) - XCTAssertEqual(cp2.y, 0) - XCTAssertEqual(end.x, 0) - XCTAssertEqual(end.y, 0) + #expect(cp1.x == 0) + #expect(cp1.y == 0) + #expect(cp2.x == 0) + #expect(cp2.y == 0) + #expect(end.x == 0) + #expect(end.y == 0) } else { - XCTFail("Expected curve element") + Issue.record("Expected curve element") } } } - func testVerySmallAngleArc() { + @Test func verySmallAngleArc() { let path = MBezierPath() path.addArc( withCenter: CGPoint(x: 0, y: 0), @@ -581,10 +581,10 @@ final class PolyfillTests: XCTestCase { ) // Should handle very small angles (essentially no arc) - XCTAssertTrue(path.isEmpty || path.cgPath.elements.count <= 2) + #expect(path.isEmpty || path.cgPath.elements.count <= 2) } - func testIdenticalStartEndAngles() { + @Test func identicalStartEndAngles() { let path = MBezierPath() path.addArc( withCenter: CGPoint(x: 0, y: 0), @@ -595,23 +595,22 @@ final class PolyfillTests: XCTestCase { ) // Should handle identical start and end angles - XCTAssertTrue(path.isEmpty || path.cgPath.elements.count <= 1) + #expect(path.isEmpty || path.cgPath.elements.count <= 1) } - func testNegativeRectDimensions() { + @Test func negativeRectDimensions() { let path = CGPath() let rect = CGRect(x: 10, y: 10, width: -5, height: -5) path.addRect(rect) // Should handle negative dimensions - XCTAssertFalse(path.elements.isEmpty) + #expect(!path.elements.isEmpty) } #else - func testPolyfillNotNeeded() { + @Test func polyfillNotNeeded() { // On platforms with CoreGraphics, polyfill types should be aliases - XCTAssertTrue(true, "CoreGraphics polyfill not needed on this platform") } #endif diff --git a/Tests/SVGViewTests/BaseTestCase.swift b/Tests/SVGViewTests/BaseTestCase.swift index e262fad1..cba49d3d 100644 --- a/Tests/SVGViewTests/BaseTestCase.swift +++ b/Tests/SVGViewTests/BaseTestCase.swift @@ -5,40 +5,30 @@ // Created by Yuriy Strot on 07.02.2021. // -import XCTest +import Foundation +import Testing @testable import SVGView -class BaseTestCase : XCTestCase { +protocol SVGTestHelper { + var dir: String { get } +} - var dir: String { - return "1.2T" - } +extension SVGTestHelper { - func compareToReference(_ fileName: String) { - let bundle = Bundle.module - let svgURL = bundle.url(forResource: fileName, withExtension: "svg", subdirectory: "w3c/\(dir)/svg/")! - let refURL = bundle.url(forResource: fileName, withExtension: "ref", subdirectory: "w3c/\(dir)/refs/")! + var dir: String { "1.2T" } - let node = SVGParser.parse(contentsOf: svgURL)! - let content = Serializer.serialize(node) - let reference = try! String(contentsOf: refURL) - - compareResultStrings(nodeContent: content, referenceContent: reference) - } + func compareToReference(_ fileName: String) throws { + let bundle = Bundle.module + let svgURL = try #require(bundle.url(forResource: fileName, withExtension: "svg", subdirectory: "w3c/\(dir)/svg/")) + let refURL = try #require(bundle.url(forResource: fileName, withExtension: "ref", subdirectory: "w3c/\(dir)/refs/")) - func compareResultStrings(nodeContent: String?, referenceContent: String?) { - guard let nodeContent = nodeContent else { - XCTFail("nodeContent is empty") - return - } - guard let referenceContent = referenceContent else { - XCTFail("referenceContent is empty") - return - } + let node = try #require(SVGParser.parse(contentsOf: svgURL)) + let content = try #require(Serializer.serialize(node)) + let reference = try String(contentsOf: refURL) - if nodeContent != referenceContent { - XCTFail("nodeContent is not equal to referenceContent. " + prettyFirstDifferenceBetweenStrings(s1: nodeContent, s2: referenceContent)) - } + let nodeContent = content + let referenceContent = reference + #expect(nodeContent == referenceContent, "nodeContent is not equal to referenceContent. \(prettyFirstDifferenceBetweenStrings(s1: nodeContent, s2: referenceContent))") } func prettyFirstDifferenceBetweenStrings(s1: String, s2: String) -> String { diff --git a/Tests/SVGViewTests/CGTests.swift b/Tests/SVGViewTests/CGTests.swift index 41f926cb..17a02e75 100644 --- a/Tests/SVGViewTests/CGTests.swift +++ b/Tests/SVGViewTests/CGTests.swift @@ -1,17 +1,17 @@ -import XCTest +import Testing @testable import SVGView -class CGTests: BaseTestCase { +struct CGTests { - func testTransformConcatenation() { + @Test func transformConcatenation() { let transform1 = CGAffineTransform(translationX: 5, y: 10) let transform2 = CGAffineTransform(scaleX: 2, y: 3) let combined = transform1.concatenating(transform2) - XCTAssertEqual(combined.a, 2) - XCTAssertEqual(combined.d, 3) - XCTAssertEqual(combined.tx, 10) - XCTAssertEqual(combined.ty, 30) + #expect(combined.a == 2) + #expect(combined.d == 3) + #expect(combined.tx == 10) + #expect(combined.ty == 30) } } diff --git a/Tests/SVGViewTests/SVG11Tests.swift b/Tests/SVGViewTests/SVG11Tests.swift index a5fe5db4..0cabd0b9 100644 --- a/Tests/SVGViewTests/SVG11Tests.swift +++ b/Tests/SVGViewTests/SVG11Tests.swift @@ -1,420 +1,418 @@ // Generated by make generate-test-cases -import XCTest +import Testing @testable import SVGView -class SVG11Tests: BaseTestCase { +struct SVG11Tests: SVGTestHelper { - override var dir: String { - return "1.1F2" - } + var dir: String { "1.1F2" } - func testColorProp01B() { - compareToReference("color-prop-01-b") + @Test func colorProp01B() throws { + try compareToReference("color-prop-01-b") } - func testColorProp02F() { - compareToReference("color-prop-02-f") + @Test func colorProp02F() throws { + try compareToReference("color-prop-02-f") } - func testColorProp03T() { - compareToReference("color-prop-03-t") + @Test func colorProp03T() throws { + try compareToReference("color-prop-03-t") } - func testColorProp04T() { - compareToReference("color-prop-04-t") + @Test func colorProp04T() throws { + try compareToReference("color-prop-04-t") } - func testColorProp05T() { - compareToReference("color-prop-05-t") + @Test func colorProp05T() throws { + try compareToReference("color-prop-05-t") } - func testCoordsCoord01T() { - compareToReference("coords-coord-01-t") + @Test func coordsCoord01T() throws { + try compareToReference("coords-coord-01-t") } - func testCoordsCoord02T() { - compareToReference("coords-coord-02-t") + @Test func coordsCoord02T() throws { + try compareToReference("coords-coord-02-t") } - func testCoordsTrans01B() { - compareToReference("coords-trans-01-b") + @Test func coordsTrans01B() throws { + try compareToReference("coords-trans-01-b") } - func testCoordsTrans02T() { - compareToReference("coords-trans-02-t") + @Test func coordsTrans02T() throws { + try compareToReference("coords-trans-02-t") } - func testCoordsTrans03T() { - compareToReference("coords-trans-03-t") + @Test func coordsTrans03T() throws { + try compareToReference("coords-trans-03-t") } - func testCoordsTrans04T() { - compareToReference("coords-trans-04-t") + @Test func coordsTrans04T() throws { + try compareToReference("coords-trans-04-t") } - func testCoordsTrans05T() { - compareToReference("coords-trans-05-t") + @Test func coordsTrans05T() throws { + try compareToReference("coords-trans-05-t") } - func testCoordsTrans06T() { - compareToReference("coords-trans-06-t") + @Test func coordsTrans06T() throws { + try compareToReference("coords-trans-06-t") } - func testCoordsTrans07T() { - compareToReference("coords-trans-07-t") + @Test func coordsTrans07T() throws { + try compareToReference("coords-trans-07-t") } - func testCoordsTrans08T() { - compareToReference("coords-trans-08-t") + @Test func coordsTrans08T() throws { + try compareToReference("coords-trans-08-t") } - func testCoordsTrans09T() { - compareToReference("coords-trans-09-t") + @Test func coordsTrans09T() throws { + try compareToReference("coords-trans-09-t") } - func testCoordsTrans10F() { - compareToReference("coords-trans-10-f") + @Test func coordsTrans10F() throws { + try compareToReference("coords-trans-10-f") } - func testCoordsTrans11F() { - compareToReference("coords-trans-11-f") + @Test func coordsTrans11F() throws { + try compareToReference("coords-trans-11-f") } - func testCoordsTrans12F() { - compareToReference("coords-trans-12-f") + @Test func coordsTrans12F() throws { + try compareToReference("coords-trans-12-f") } - func testCoordsTrans13F() { - compareToReference("coords-trans-13-f") + @Test func coordsTrans13F() throws { + try compareToReference("coords-trans-13-f") } - func testCoordsTrans14F() { - compareToReference("coords-trans-14-f") + @Test func coordsTrans14F() throws { + try compareToReference("coords-trans-14-f") } - func testCoordsTransformattr01F() { - compareToReference("coords-transformattr-01-f") + @Test func coordsTransformattr01F() throws { + try compareToReference("coords-transformattr-01-f") } - func testCoordsTransformattr02F() { - compareToReference("coords-transformattr-02-f") + @Test func coordsTransformattr02F() throws { + try compareToReference("coords-transformattr-02-f") } - func testCoordsTransformattr03F() { - compareToReference("coords-transformattr-03-f") + @Test func coordsTransformattr03F() throws { + try compareToReference("coords-transformattr-03-f") } - func testCoordsTransformattr04F() { - compareToReference("coords-transformattr-04-f") + @Test func coordsTransformattr04F() throws { + try compareToReference("coords-transformattr-04-f") } - func testCoordsTransformattr05F() { - compareToReference("coords-transformattr-05-f") + @Test func coordsTransformattr05F() throws { + try compareToReference("coords-transformattr-05-f") } - func testCoordsUnits02B() { - compareToReference("coords-units-02-b") + @Test func coordsUnits02B() throws { + try compareToReference("coords-units-02-b") } - func testCoordsUnits03B() { - compareToReference("coords-units-03-b") + @Test func coordsUnits03B() throws { + try compareToReference("coords-units-03-b") } - func testMaskingOpacity01B() { - compareToReference("masking-opacity-01-b") + @Test func maskingOpacity01B() throws { + try compareToReference("masking-opacity-01-b") } - func testPaintingControl02F() { - compareToReference("painting-control-02-f") + @Test func paintingControl02F() throws { + try compareToReference("painting-control-02-f") } - func testPaintingControl03F() { - compareToReference("painting-control-03-f") + @Test func paintingControl03F() throws { + try compareToReference("painting-control-03-f") } - func testPaintingFill01T() { - compareToReference("painting-fill-01-t") + @Test func paintingFill01T() throws { + try compareToReference("painting-fill-01-t") } - func testPaintingFill02T() { - compareToReference("painting-fill-02-t") + @Test func paintingFill02T() throws { + try compareToReference("painting-fill-02-t") } - func testPaintingFill03T() { - compareToReference("painting-fill-03-t") + @Test func paintingFill03T() throws { + try compareToReference("painting-fill-03-t") } - func testPaintingFill04T() { - compareToReference("painting-fill-04-t") + @Test func paintingFill04T() throws { + try compareToReference("painting-fill-04-t") } - func testPaintingFill05B() { - compareToReference("painting-fill-05-b") + @Test func paintingFill05B() throws { + try compareToReference("painting-fill-05-b") } - func testPaintingMarker01F() { - compareToReference("painting-marker-01-f") + @Test func paintingMarker01F() throws { + try compareToReference("painting-marker-01-f") } - func testPaintingStroke01T() { - compareToReference("painting-stroke-01-t") + @Test func paintingStroke01T() throws { + try compareToReference("painting-stroke-01-t") } - func testPaintingStroke02T() { - compareToReference("painting-stroke-02-t") + @Test func paintingStroke02T() throws { + try compareToReference("painting-stroke-02-t") } - func testPaintingStroke03T() { - compareToReference("painting-stroke-03-t") + @Test func paintingStroke03T() throws { + try compareToReference("painting-stroke-03-t") } - func testPaintingStroke04T() { - compareToReference("painting-stroke-04-t") + @Test func paintingStroke04T() throws { + try compareToReference("painting-stroke-04-t") } - func testPaintingStroke05T() { - compareToReference("painting-stroke-05-t") + @Test func paintingStroke05T() throws { + try compareToReference("painting-stroke-05-t") } - func testPaintingStroke07T() { - compareToReference("painting-stroke-07-t") + @Test func paintingStroke07T() throws { + try compareToReference("painting-stroke-07-t") } - func testPaintingStroke08T() { - compareToReference("painting-stroke-08-t") + @Test func paintingStroke08T() throws { + try compareToReference("painting-stroke-08-t") } - func testPaintingStroke09T() { - compareToReference("painting-stroke-09-t") + @Test func paintingStroke09T() throws { + try compareToReference("painting-stroke-09-t") } - func testPathsData01T() { - compareToReference("paths-data-01-t") + @Test func pathsData01T() throws { + try compareToReference("paths-data-01-t") } - func testPathsData02T() { - compareToReference("paths-data-02-t") + @Test func pathsData02T() throws { + try compareToReference("paths-data-02-t") } - func testPathsData03F() { - compareToReference("paths-data-03-f") + @Test func pathsData03F() throws { + try compareToReference("paths-data-03-f") } - func testPathsData04T() { - compareToReference("paths-data-04-t") + @Test func pathsData04T() throws { + try compareToReference("paths-data-04-t") } - func testPathsData05T() { - compareToReference("paths-data-05-t") + @Test func pathsData05T() throws { + try compareToReference("paths-data-05-t") } - func testPathsData06T() { - compareToReference("paths-data-06-t") + @Test func pathsData06T() throws { + try compareToReference("paths-data-06-t") } - func testPathsData07T() { - compareToReference("paths-data-07-t") + @Test func pathsData07T() throws { + try compareToReference("paths-data-07-t") } - func testPathsData08T() { - compareToReference("paths-data-08-t") + @Test func pathsData08T() throws { + try compareToReference("paths-data-08-t") } - func testPathsData09T() { - compareToReference("paths-data-09-t") + @Test func pathsData09T() throws { + try compareToReference("paths-data-09-t") } - func testPathsData10T() { - compareToReference("paths-data-10-t") + @Test func pathsData10T() throws { + try compareToReference("paths-data-10-t") } - func testPathsData12T() { - compareToReference("paths-data-12-t") + @Test func pathsData12T() throws { + try compareToReference("paths-data-12-t") } - func testPathsData13T() { - compareToReference("paths-data-13-t") + @Test func pathsData13T() throws { + try compareToReference("paths-data-13-t") } - func testPathsData14T() { - compareToReference("paths-data-14-t") + @Test func pathsData14T() throws { + try compareToReference("paths-data-14-t") } - func testPathsData15T() { - compareToReference("paths-data-15-t") + @Test func pathsData15T() throws { + try compareToReference("paths-data-15-t") } - func testPathsData16T() { - compareToReference("paths-data-16-t") + @Test func pathsData16T() throws { + try compareToReference("paths-data-16-t") } - func testPathsData17F() { - compareToReference("paths-data-17-f") + @Test func pathsData17F() throws { + try compareToReference("paths-data-17-f") } - func testPathsData18F() { - compareToReference("paths-data-18-f") + @Test func pathsData18F() throws { + try compareToReference("paths-data-18-f") } - func testPathsData19F() { - compareToReference("paths-data-19-f") + @Test func pathsData19F() throws { + try compareToReference("paths-data-19-f") } - func testPathsData20F() { - compareToReference("paths-data-20-f") + @Test func pathsData20F() throws { + try compareToReference("paths-data-20-f") } - func testPserversGrad01B() { - compareToReference("pservers-grad-01-b") + @Test func pserversGrad01B() throws { + try compareToReference("pservers-grad-01-b") } - func testPserversGrad02B() { - compareToReference("pservers-grad-02-b") + @Test func pserversGrad02B() throws { + try compareToReference("pservers-grad-02-b") } - func testPserversGrad04B() { - compareToReference("pservers-grad-04-b") + @Test func pserversGrad04B() throws { + try compareToReference("pservers-grad-04-b") } - func testPserversGrad05B() { - compareToReference("pservers-grad-05-b") + @Test func pserversGrad05B() throws { + try compareToReference("pservers-grad-05-b") } - func testPserversGrad07B() { - compareToReference("pservers-grad-07-b") + @Test func pserversGrad07B() throws { + try compareToReference("pservers-grad-07-b") } - func testPserversGrad09B() { - compareToReference("pservers-grad-09-b") + @Test func pserversGrad09B() throws { + try compareToReference("pservers-grad-09-b") } - func testRenderElems01T() { - compareToReference("render-elems-01-t") + @Test func renderElems01T() throws { + try compareToReference("render-elems-01-t") } - func testRenderElems02T() { - compareToReference("render-elems-02-t") + @Test func renderElems02T() throws { + try compareToReference("render-elems-02-t") } - func testRenderElems03T() { - compareToReference("render-elems-03-t") + @Test func renderElems03T() throws { + try compareToReference("render-elems-03-t") } - func testShapesCircle01T() { - compareToReference("shapes-circle-01-t") + @Test func shapesCircle01T() throws { + try compareToReference("shapes-circle-01-t") } - func testShapesCircle02T() { - compareToReference("shapes-circle-02-t") + @Test func shapesCircle02T() throws { + try compareToReference("shapes-circle-02-t") } - func testShapesEllipse01T() { - compareToReference("shapes-ellipse-01-t") + @Test func shapesEllipse01T() throws { + try compareToReference("shapes-ellipse-01-t") } - func testShapesEllipse02T() { - compareToReference("shapes-ellipse-02-t") + @Test func shapesEllipse02T() throws { + try compareToReference("shapes-ellipse-02-t") } - func testShapesEllipse03F() { - compareToReference("shapes-ellipse-03-f") + @Test func shapesEllipse03F() throws { + try compareToReference("shapes-ellipse-03-f") } - func testShapesGrammar01F() { - compareToReference("shapes-grammar-01-f") + @Test func shapesGrammar01F() throws { + try compareToReference("shapes-grammar-01-f") } - func testShapesIntro01T() { - compareToReference("shapes-intro-01-t") + @Test func shapesIntro01T() throws { + try compareToReference("shapes-intro-01-t") } - func testShapesLine01T() { - compareToReference("shapes-line-01-t") + @Test func shapesLine01T() throws { + try compareToReference("shapes-line-01-t") } - func testShapesLine02F() { - compareToReference("shapes-line-02-f") + @Test func shapesLine02F() throws { + try compareToReference("shapes-line-02-f") } - func testShapesPolygon01T() { - compareToReference("shapes-polygon-01-t") + @Test func shapesPolygon01T() throws { + try compareToReference("shapes-polygon-01-t") } - func testShapesPolygon02T() { - compareToReference("shapes-polygon-02-t") + @Test func shapesPolygon02T() throws { + try compareToReference("shapes-polygon-02-t") } - func testShapesPolygon03T() { - compareToReference("shapes-polygon-03-t") + @Test func shapesPolygon03T() throws { + try compareToReference("shapes-polygon-03-t") } - func testShapesPolyline01T() { - compareToReference("shapes-polyline-01-t") + @Test func shapesPolyline01T() throws { + try compareToReference("shapes-polyline-01-t") } - func testShapesPolyline02T() { - compareToReference("shapes-polyline-02-t") + @Test func shapesPolyline02T() throws { + try compareToReference("shapes-polyline-02-t") } - func testShapesRect02T() { - compareToReference("shapes-rect-02-t") + @Test func shapesRect02T() throws { + try compareToReference("shapes-rect-02-t") } - func testShapesRect04F() { - compareToReference("shapes-rect-04-f") + @Test func shapesRect04F() throws { + try compareToReference("shapes-rect-04-f") } - func testShapesRect05F() { - compareToReference("shapes-rect-05-f") + @Test func shapesRect05F() throws { + try compareToReference("shapes-rect-05-f") } - func testShapesRect06F() { - compareToReference("shapes-rect-06-f") + @Test func shapesRect06F() throws { + try compareToReference("shapes-rect-06-f") } - func testStructDefs01T() { - compareToReference("struct-defs-01-t") + @Test func structDefs01T() throws { + try compareToReference("struct-defs-01-t") } - func testStructFrag01T() { - compareToReference("struct-frag-01-t") + @Test func structFrag01T() throws { + try compareToReference("struct-frag-01-t") } - func testStructFrag06T() { - compareToReference("struct-frag-06-t") + @Test func structFrag06T() throws { + try compareToReference("struct-frag-06-t") } - func testStructGroup01T() { - compareToReference("struct-group-01-t") + @Test func structGroup01T() throws { + try compareToReference("struct-group-01-t") } - func testStructImage01T() { - compareToReference("struct-image-01-t") + @Test func structImage01T() throws { + try compareToReference("struct-image-01-t") } - func testStructImage04T() { - compareToReference("struct-image-04-t") + @Test func structImage04T() throws { + try compareToReference("struct-image-04-t") } - func testStructUse03T() { - compareToReference("struct-use-03-t") + @Test func structUse03T() throws { + try compareToReference("struct-use-03-t") } - func testStylingClass01F() { - compareToReference("styling-class-01-f") + @Test func stylingClass01F() throws { + try compareToReference("styling-class-01-f") } - func testStylingCss01B() { - compareToReference("styling-css-01-b") + @Test func stylingCss01B() throws { + try compareToReference("styling-css-01-b") } - func testStylingPres01T() { - compareToReference("styling-pres-01-t") + @Test func stylingPres01T() throws { + try compareToReference("styling-pres-01-t") } - func testTypesBasic01F() { - compareToReference("types-basic-01-f") + @Test func typesBasic01F() throws { + try compareToReference("types-basic-01-f") } } \ No newline at end of file diff --git a/Tests/SVGViewTests/SVG12Tests.swift b/Tests/SVGViewTests/SVG12Tests.swift index 50e09081..f5f7c417 100644 --- a/Tests/SVGViewTests/SVG12Tests.swift +++ b/Tests/SVGViewTests/SVG12Tests.swift @@ -1,124 +1,124 @@ // Generated by make generate-test-cases -import XCTest +import Testing @testable import SVGView -class SVG12Tests: BaseTestCase { +struct SVG12Tests: SVGTestHelper { - override var dir: String { - return "1.2T" + var dir: String { + "1.2T" } - func testCoordsTrans01T() { - compareToReference("coords-trans-01-t") + @Test func coordsTrans01T() throws { + try compareToReference("coords-trans-01-t") } - func testCoordsTrans02T() { - compareToReference("coords-trans-02-t") + @Test func coordsTrans02T() throws { + try compareToReference("coords-trans-02-t") } - func testCoordsTrans03T() { - compareToReference("coords-trans-03-t") + @Test func coordsTrans03T() throws { + try compareToReference("coords-trans-03-t") } - func testCoordsTrans04T() { - compareToReference("coords-trans-04-t") + @Test func coordsTrans04T() throws { + try compareToReference("coords-trans-04-t") } - func testCoordsTrans05T() { - compareToReference("coords-trans-05-t") + @Test func coordsTrans05T() throws { + try compareToReference("coords-trans-05-t") } - func testCoordsTrans06T() { - compareToReference("coords-trans-06-t") + @Test func coordsTrans06T() throws { + try compareToReference("coords-trans-06-t") } - func testCoordsTrans07T() { - compareToReference("coords-trans-07-t") + @Test func coordsTrans07T() throws { + try compareToReference("coords-trans-07-t") } - func testCoordsTrans08T() { - compareToReference("coords-trans-08-t") + @Test func coordsTrans08T() throws { + try compareToReference("coords-trans-08-t") } - func testCoordsTrans09T() { - compareToReference("coords-trans-09-t") + @Test func coordsTrans09T() throws { + try compareToReference("coords-trans-09-t") } - func testPaintColor03T() { - compareToReference("paint-color-03-t") + @Test func paintColor03T() throws { + try compareToReference("paint-color-03-t") } - func testPaintColor201T() { - compareToReference("paint-color-201-t") + @Test func paintColor201T() throws { + try compareToReference("paint-color-201-t") } - func testPaintFill04T() { - compareToReference("paint-fill-04-t") + @Test func paintFill04T() throws { + try compareToReference("paint-fill-04-t") } - func testPaintFill06T() { - compareToReference("paint-fill-06-t") + @Test func paintFill06T() throws { + try compareToReference("paint-fill-06-t") } - func testPaintStroke01T() { - compareToReference("paint-stroke-01-t") + @Test func paintStroke01T() throws { + try compareToReference("paint-stroke-01-t") } - func testPathsData01T() { - compareToReference("paths-data-01-t") + @Test func pathsData01T() throws { + try compareToReference("paths-data-01-t") } - func testPathsData02T() { - compareToReference("paths-data-02-t") + @Test func pathsData02T() throws { + try compareToReference("paths-data-02-t") } - func testRenderElems01T() { - compareToReference("render-elems-01-t") + @Test func renderElems01T() throws { + try compareToReference("render-elems-01-t") } - func testRenderElems02T() { - compareToReference("render-elems-02-t") + @Test func renderElems02T() throws { + try compareToReference("render-elems-02-t") } - func testRenderElems03T() { - compareToReference("render-elems-03-t") + @Test func renderElems03T() throws { + try compareToReference("render-elems-03-t") } - func testShapesCircle01T() { - compareToReference("shapes-circle-01-t") + @Test func shapesCircle01T() throws { + try compareToReference("shapes-circle-01-t") } - func testShapesEllipse01T() { - compareToReference("shapes-ellipse-01-t") + @Test func shapesEllipse01T() throws { + try compareToReference("shapes-ellipse-01-t") } - func testShapesLine01T() { - compareToReference("shapes-line-01-t") + @Test func shapesLine01T() throws { + try compareToReference("shapes-line-01-t") } - func testShapesPolygon01T() { - compareToReference("shapes-polygon-01-t") + @Test func shapesPolygon01T() throws { + try compareToReference("shapes-polygon-01-t") } - func testShapesPolyline01T() { - compareToReference("shapes-polyline-01-t") + @Test func shapesPolyline01T() throws { + try compareToReference("shapes-polyline-01-t") } - func testShapesRect02T() { - compareToReference("shapes-rect-02-t") + @Test func shapesRect02T() throws { + try compareToReference("shapes-rect-02-t") } - func testStructDefs01T() { - compareToReference("struct-defs-01-t") + @Test func structDefs01T() throws { + try compareToReference("struct-defs-01-t") } - func testStructFrag01T() { - compareToReference("struct-frag-01-t") + @Test func structFrag01T() throws { + try compareToReference("struct-frag-01-t") } - func testStructUse03T() { - compareToReference("struct-use-03-t") + @Test func structUse03T() throws { + try compareToReference("struct-use-03-t") } } \ No newline at end of file diff --git a/Tests/SVGViewTests/SVGCustomTests.swift b/Tests/SVGViewTests/SVGCustomTests.swift index ec4043b0..4ccd1eea 100644 --- a/Tests/SVGViewTests/SVGCustomTests.swift +++ b/Tests/SVGViewTests/SVGCustomTests.swift @@ -1,24 +1,24 @@ // Generated by make generate-test-cases -import XCTest +import Testing @testable import SVGView -class SVGCustomTests: BaseTestCase { +struct SVGCustomTests: SVGTestHelper { - override var dir: String { - return "Custom" + var dir: String { + "Custom" } - func testGraph01() { - compareToReference("graph-01") + @Test func graph01() throws { + try compareToReference("graph-01") } - func testViewport01() { - compareToReference("viewport-01") + @Test func viewport01() throws { + try compareToReference("viewport-01") } - func testViewport02() { - compareToReference("viewport-02") + @Test func viewport02() throws { + try compareToReference("viewport-02") } } \ No newline at end of file From 9f3fd5439da7ab674c557b61968e63bba6745c6f Mon Sep 17 00:00:00 2001 From: Mathias Amnell <104110+Amnell@users.noreply.github.com> Date: Sun, 24 May 2026 13:21:57 +0200 Subject: [PATCH 04/19] Improve our test helper --- Tests/SVGViewTests/BaseTestCase.swift | 49 ++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 4 deletions(-) diff --git a/Tests/SVGViewTests/BaseTestCase.swift b/Tests/SVGViewTests/BaseTestCase.swift index cba49d3d..2b3a4025 100644 --- a/Tests/SVGViewTests/BaseTestCase.swift +++ b/Tests/SVGViewTests/BaseTestCase.swift @@ -23,17 +23,58 @@ extension SVGTestHelper { let refURL = try #require(bundle.url(forResource: fileName, withExtension: "ref", subdirectory: "w3c/\(dir)/refs/")) let node = try #require(SVGParser.parse(contentsOf: svgURL)) - let content = try #require(Serializer.serialize(node)) + let content = Serializer.serialize(node) let reference = try String(contentsOf: refURL) - let nodeContent = content - let referenceContent = reference - #expect(nodeContent == referenceContent, "nodeContent is not equal to referenceContent. \(prettyFirstDifferenceBetweenStrings(s1: nodeContent, s2: referenceContent))") + Attachment.record(Attachment(content, named: "\(fileName)-actual.txt")) + Attachment.record(Attachment(reference, named: "\(fileName)-expected.txt")) + Attachment.record(Attachment(unifiedDiff(actual: content, expected: reference), named: "\(fileName)-diff.txt")) + + #expect(content == reference, "nodeContent is not equal to referenceContent. \(prettyFirstDifferenceBetweenStrings(s1: content, s2: reference))") } func prettyFirstDifferenceBetweenStrings(s1: String, s2: String) -> String { return prettyFirstDifferenceBetweenNSStrings(s1: s1 as NSString, s2: s2 as NSString) as String } + + func unifiedDiff(actual: String, expected: String) -> String { + let actualLines = actual.components(separatedBy: "\n") + let expectedLines = expected.components(separatedBy: "\n") + var result = "--- expected\n+++ actual\n" + let lcs = longestCommonSubsequence(actualLines, expectedLines) + var i = 0, j = 0, k = 0 + while i < actualLines.count || j < expectedLines.count { + if i < actualLines.count && j < expectedLines.count && k < lcs.count && actualLines[i] == lcs[k] && expectedLines[j] == lcs[k] { + result += " \(actualLines[i])\n" + i += 1; j += 1; k += 1 + } else if j < expectedLines.count && (k >= lcs.count || expectedLines[j] != lcs[k]) { + result += "-\(expectedLines[j])\n" + j += 1 + } else { + result += "+\(actualLines[i])\n" + i += 1 + } + } + return result + } + + private func longestCommonSubsequence(_ a: [String], _ b: [String]) -> [String] { + let m = a.count, n = b.count + var dp = Array(repeating: Array(repeating: 0, count: n + 1), count: m + 1) + for i in 1...m { + for j in 1...n { + dp[i][j] = a[i-1] == b[j-1] ? dp[i-1][j-1] + 1 : max(dp[i-1][j], dp[i][j-1]) + } + } + var result: [String] = [] + var i = m, j = n + while i > 0 && j > 0 { + if a[i-1] == b[j-1] { result.append(a[i-1]); i -= 1; j -= 1 } + else if dp[i-1][j] > dp[i][j-1] { i -= 1 } + else { j -= 1 } + } + return result.reversed() + } } /// Find first differing character between two strings From 42193d1d94861b3e348c8b4f29cec880ee8cf31e Mon Sep 17 00:00:00 2001 From: Mathias Amnell <104110+Amnell@users.noreply.github.com> Date: Sun, 24 May 2026 13:22:07 +0200 Subject: [PATCH 05/19] Split tests to suites --- Tests/SVGViewTests/SVG11Tests.swift | 586 ++++++++-------------------- Tests/SVGViewTests/SVG12Tests.swift | 176 +++------ 2 files changed, 226 insertions(+), 536 deletions(-) diff --git a/Tests/SVGViewTests/SVG11Tests.swift b/Tests/SVGViewTests/SVG11Tests.swift index 0cabd0b9..b7b6f1bf 100644 --- a/Tests/SVGViewTests/SVG11Tests.swift +++ b/Tests/SVGViewTests/SVG11Tests.swift @@ -1,418 +1,174 @@ -// Generated by make generate-test-cases - import Testing @testable import SVGView -struct SVG11Tests: SVGTestHelper { - - var dir: String { "1.1F2" } - - @Test func colorProp01B() throws { - try compareToReference("color-prop-01-b") - } - - @Test func colorProp02F() throws { - try compareToReference("color-prop-02-f") - } - - @Test func colorProp03T() throws { - try compareToReference("color-prop-03-t") - } - - @Test func colorProp04T() throws { - try compareToReference("color-prop-04-t") - } - - @Test func colorProp05T() throws { - try compareToReference("color-prop-05-t") - } - - @Test func coordsCoord01T() throws { - try compareToReference("coords-coord-01-t") - } - - @Test func coordsCoord02T() throws { - try compareToReference("coords-coord-02-t") - } - - @Test func coordsTrans01B() throws { - try compareToReference("coords-trans-01-b") - } - - @Test func coordsTrans02T() throws { - try compareToReference("coords-trans-02-t") - } - - @Test func coordsTrans03T() throws { - try compareToReference("coords-trans-03-t") - } - - @Test func coordsTrans04T() throws { - try compareToReference("coords-trans-04-t") - } - - @Test func coordsTrans05T() throws { - try compareToReference("coords-trans-05-t") - } - - @Test func coordsTrans06T() throws { - try compareToReference("coords-trans-06-t") - } - - @Test func coordsTrans07T() throws { - try compareToReference("coords-trans-07-t") - } - - @Test func coordsTrans08T() throws { - try compareToReference("coords-trans-08-t") - } - - @Test func coordsTrans09T() throws { - try compareToReference("coords-trans-09-t") - } - - @Test func coordsTrans10F() throws { - try compareToReference("coords-trans-10-f") - } - - @Test func coordsTrans11F() throws { - try compareToReference("coords-trans-11-f") - } - - @Test func coordsTrans12F() throws { - try compareToReference("coords-trans-12-f") - } - - @Test func coordsTrans13F() throws { - try compareToReference("coords-trans-13-f") - } - - @Test func coordsTrans14F() throws { - try compareToReference("coords-trans-14-f") - } - - @Test func coordsTransformattr01F() throws { - try compareToReference("coords-transformattr-01-f") - } - - @Test func coordsTransformattr02F() throws { - try compareToReference("coords-transformattr-02-f") - } - - @Test func coordsTransformattr03F() throws { - try compareToReference("coords-transformattr-03-f") - } - - @Test func coordsTransformattr04F() throws { - try compareToReference("coords-transformattr-04-f") - } - - @Test func coordsTransformattr05F() throws { - try compareToReference("coords-transformattr-05-f") - } - - @Test func coordsUnits02B() throws { - try compareToReference("coords-units-02-b") - } - - @Test func coordsUnits03B() throws { - try compareToReference("coords-units-03-b") - } - - @Test func maskingOpacity01B() throws { - try compareToReference("masking-opacity-01-b") - } - - @Test func paintingControl02F() throws { - try compareToReference("painting-control-02-f") - } - - @Test func paintingControl03F() throws { - try compareToReference("painting-control-03-f") - } - - @Test func paintingFill01T() throws { - try compareToReference("painting-fill-01-t") - } - - @Test func paintingFill02T() throws { - try compareToReference("painting-fill-02-t") - } - - @Test func paintingFill03T() throws { - try compareToReference("painting-fill-03-t") - } - - @Test func paintingFill04T() throws { - try compareToReference("painting-fill-04-t") - } - - @Test func paintingFill05B() throws { - try compareToReference("painting-fill-05-b") - } - - @Test func paintingMarker01F() throws { - try compareToReference("painting-marker-01-f") - } - - @Test func paintingStroke01T() throws { - try compareToReference("painting-stroke-01-t") - } - - @Test func paintingStroke02T() throws { - try compareToReference("painting-stroke-02-t") - } - - @Test func paintingStroke03T() throws { - try compareToReference("painting-stroke-03-t") - } - - @Test func paintingStroke04T() throws { - try compareToReference("painting-stroke-04-t") - } - - @Test func paintingStroke05T() throws { - try compareToReference("painting-stroke-05-t") - } - - @Test func paintingStroke07T() throws { - try compareToReference("painting-stroke-07-t") - } - - @Test func paintingStroke08T() throws { - try compareToReference("painting-stroke-08-t") - } - - @Test func paintingStroke09T() throws { - try compareToReference("painting-stroke-09-t") - } - - @Test func pathsData01T() throws { - try compareToReference("paths-data-01-t") - } - - @Test func pathsData02T() throws { - try compareToReference("paths-data-02-t") - } - - @Test func pathsData03F() throws { - try compareToReference("paths-data-03-f") - } - - @Test func pathsData04T() throws { - try compareToReference("paths-data-04-t") - } - - @Test func pathsData05T() throws { - try compareToReference("paths-data-05-t") - } - - @Test func pathsData06T() throws { - try compareToReference("paths-data-06-t") - } - - @Test func pathsData07T() throws { - try compareToReference("paths-data-07-t") - } - - @Test func pathsData08T() throws { - try compareToReference("paths-data-08-t") - } - - @Test func pathsData09T() throws { - try compareToReference("paths-data-09-t") - } - - @Test func pathsData10T() throws { - try compareToReference("paths-data-10-t") - } - - @Test func pathsData12T() throws { - try compareToReference("paths-data-12-t") - } - - @Test func pathsData13T() throws { - try compareToReference("paths-data-13-t") - } - - @Test func pathsData14T() throws { - try compareToReference("paths-data-14-t") - } - - @Test func pathsData15T() throws { - try compareToReference("paths-data-15-t") - } - - @Test func pathsData16T() throws { - try compareToReference("paths-data-16-t") - } - - @Test func pathsData17F() throws { - try compareToReference("paths-data-17-f") - } - - @Test func pathsData18F() throws { - try compareToReference("paths-data-18-f") - } - - @Test func pathsData19F() throws { - try compareToReference("paths-data-19-f") - } - - @Test func pathsData20F() throws { - try compareToReference("paths-data-20-f") - } - - @Test func pserversGrad01B() throws { - try compareToReference("pservers-grad-01-b") - } - - @Test func pserversGrad02B() throws { - try compareToReference("pservers-grad-02-b") - } - - @Test func pserversGrad04B() throws { - try compareToReference("pservers-grad-04-b") - } - - @Test func pserversGrad05B() throws { - try compareToReference("pservers-grad-05-b") - } - - @Test func pserversGrad07B() throws { - try compareToReference("pservers-grad-07-b") - } - - @Test func pserversGrad09B() throws { - try compareToReference("pservers-grad-09-b") - } - - @Test func renderElems01T() throws { - try compareToReference("render-elems-01-t") - } - - @Test func renderElems02T() throws { - try compareToReference("render-elems-02-t") - } - - @Test func renderElems03T() throws { - try compareToReference("render-elems-03-t") - } - - @Test func shapesCircle01T() throws { - try compareToReference("shapes-circle-01-t") - } - - @Test func shapesCircle02T() throws { - try compareToReference("shapes-circle-02-t") - } - - @Test func shapesEllipse01T() throws { - try compareToReference("shapes-ellipse-01-t") - } - - @Test func shapesEllipse02T() throws { - try compareToReference("shapes-ellipse-02-t") - } - - @Test func shapesEllipse03F() throws { - try compareToReference("shapes-ellipse-03-f") - } - - @Test func shapesGrammar01F() throws { - try compareToReference("shapes-grammar-01-f") - } - - @Test func shapesIntro01T() throws { - try compareToReference("shapes-intro-01-t") - } - - @Test func shapesLine01T() throws { - try compareToReference("shapes-line-01-t") - } - - @Test func shapesLine02F() throws { - try compareToReference("shapes-line-02-f") - } - - @Test func shapesPolygon01T() throws { - try compareToReference("shapes-polygon-01-t") - } - - @Test func shapesPolygon02T() throws { - try compareToReference("shapes-polygon-02-t") - } - - @Test func shapesPolygon03T() throws { - try compareToReference("shapes-polygon-03-t") - } - - @Test func shapesPolyline01T() throws { - try compareToReference("shapes-polyline-01-t") - } - - @Test func shapesPolyline02T() throws { - try compareToReference("shapes-polyline-02-t") - } - - @Test func shapesRect02T() throws { - try compareToReference("shapes-rect-02-t") - } - - @Test func shapesRect04F() throws { - try compareToReference("shapes-rect-04-f") - } - - @Test func shapesRect05F() throws { - try compareToReference("shapes-rect-05-f") - } - - @Test func shapesRect06F() throws { - try compareToReference("shapes-rect-06-f") - } - - @Test func structDefs01T() throws { - try compareToReference("struct-defs-01-t") - } - - @Test func structFrag01T() throws { - try compareToReference("struct-frag-01-t") - } - - @Test func structFrag06T() throws { - try compareToReference("struct-frag-06-t") - } - - @Test func structGroup01T() throws { - try compareToReference("struct-group-01-t") - } - - @Test func structImage01T() throws { - try compareToReference("struct-image-01-t") - } - - @Test func structImage04T() throws { - try compareToReference("struct-image-04-t") - } - - @Test func structUse03T() throws { - try compareToReference("struct-use-03-t") - } - - @Test func stylingClass01F() throws { - try compareToReference("styling-class-01-f") - } - - @Test func stylingCss01B() throws { - try compareToReference("styling-css-01-b") - } - - @Test func stylingPres01T() throws { - try compareToReference("styling-pres-01-t") - } - - @Test func typesBasic01F() throws { - try compareToReference("types-basic-01-f") - } - -} \ No newline at end of file +@Suite("SVG 1.1") +struct SVG11Tests { + + @Suite("Color") + struct Color: SVGTestHelper { + var dir: String { "1.1F2" } + + @Test func colorProp01B() throws { try compareToReference("color-prop-01-b") } + @Test func colorProp02F() throws { try compareToReference("color-prop-02-f") } + @Test func colorProp03T() throws { try compareToReference("color-prop-03-t") } + @Test func colorProp04T() throws { try compareToReference("color-prop-04-t") } + @Test func colorProp05T() throws { try compareToReference("color-prop-05-t") } + } + + @Suite("Coords") + struct Coords: SVGTestHelper { + var dir: String { "1.1F2" } + + @Test func coordsCoord01T() throws { try compareToReference("coords-coord-01-t") } + @Test func coordsCoord02T() throws { try compareToReference("coords-coord-02-t") } + @Test func coordsTrans01B() throws { try compareToReference("coords-trans-01-b") } + @Test func coordsTrans02T() throws { try compareToReference("coords-trans-02-t") } + @Test func coordsTrans03T() throws { try compareToReference("coords-trans-03-t") } + @Test func coordsTrans04T() throws { try compareToReference("coords-trans-04-t") } + @Test func coordsTrans05T() throws { try compareToReference("coords-trans-05-t") } + @Test func coordsTrans06T() throws { try compareToReference("coords-trans-06-t") } + @Test func coordsTrans07T() throws { try compareToReference("coords-trans-07-t") } + @Test func coordsTrans08T() throws { try compareToReference("coords-trans-08-t") } + @Test func coordsTrans09T() throws { try compareToReference("coords-trans-09-t") } + @Test func coordsTrans10F() throws { try compareToReference("coords-trans-10-f") } + @Test func coordsTrans11F() throws { try compareToReference("coords-trans-11-f") } + @Test func coordsTrans12F() throws { try compareToReference("coords-trans-12-f") } + @Test func coordsTrans13F() throws { try compareToReference("coords-trans-13-f") } + @Test func coordsTrans14F() throws { try compareToReference("coords-trans-14-f") } + @Test func coordsTransformattr01F() throws { try compareToReference("coords-transformattr-01-f") } + @Test func coordsTransformattr02F() throws { try compareToReference("coords-transformattr-02-f") } + @Test func coordsTransformattr03F() throws { try compareToReference("coords-transformattr-03-f") } + @Test func coordsTransformattr04F() throws { try compareToReference("coords-transformattr-04-f") } + @Test func coordsTransformattr05F() throws { try compareToReference("coords-transformattr-05-f") } + @Test func coordsUnits02B() throws { try compareToReference("coords-units-02-b") } + @Test func coordsUnits03B() throws { try compareToReference("coords-units-03-b") } + } + + @Suite("Masking") + struct Masking: SVGTestHelper { + var dir: String { "1.1F2" } + + @Test func maskingOpacity01B() throws { try compareToReference("masking-opacity-01-b") } + } + + @Suite("Painting") + struct Painting: SVGTestHelper { + var dir: String { "1.1F2" } + + @Test func paintingControl02F() throws { try compareToReference("painting-control-02-f") } + @Test func paintingControl03F() throws { try compareToReference("painting-control-03-f") } + @Test func paintingFill01T() throws { try compareToReference("painting-fill-01-t") } + @Test func paintingFill02T() throws { try compareToReference("painting-fill-02-t") } + @Test func paintingFill03T() throws { try compareToReference("painting-fill-03-t") } + @Test func paintingFill04T() throws { try compareToReference("painting-fill-04-t") } + @Test func paintingFill05B() throws { try compareToReference("painting-fill-05-b") } + @Test func paintingMarker01F() throws { try compareToReference("painting-marker-01-f") } + @Test func paintingStroke01T() throws { try compareToReference("painting-stroke-01-t") } + @Test func paintingStroke02T() throws { try compareToReference("painting-stroke-02-t") } + @Test func paintingStroke03T() throws { try compareToReference("painting-stroke-03-t") } + @Test func paintingStroke04T() throws { try compareToReference("painting-stroke-04-t") } + @Test func paintingStroke05T() throws { try compareToReference("painting-stroke-05-t") } + @Test func paintingStroke07T() throws { try compareToReference("painting-stroke-07-t") } + @Test func paintingStroke08T() throws { try compareToReference("painting-stroke-08-t") } + @Test func paintingStroke09T() throws { try compareToReference("painting-stroke-09-t") } + } + + @Suite("Paths") + struct Paths: SVGTestHelper { + var dir: String { "1.1F2" } + + @Test func pathsData01T() throws { try compareToReference("paths-data-01-t") } + @Test func pathsData02T() throws { try compareToReference("paths-data-02-t") } + @Test func pathsData03F() throws { try compareToReference("paths-data-03-f") } + @Test func pathsData04T() throws { try compareToReference("paths-data-04-t") } + @Test func pathsData05T() throws { try compareToReference("paths-data-05-t") } + @Test func pathsData06T() throws { try compareToReference("paths-data-06-t") } + @Test func pathsData07T() throws { try compareToReference("paths-data-07-t") } + @Test func pathsData08T() throws { try compareToReference("paths-data-08-t") } + @Test func pathsData09T() throws { try compareToReference("paths-data-09-t") } + @Test func pathsData10T() throws { try compareToReference("paths-data-10-t") } + @Test func pathsData12T() throws { try compareToReference("paths-data-12-t") } + @Test func pathsData13T() throws { try compareToReference("paths-data-13-t") } + @Test func pathsData14T() throws { try compareToReference("paths-data-14-t") } + @Test func pathsData15T() throws { try compareToReference("paths-data-15-t") } + @Test func pathsData16T() throws { try compareToReference("paths-data-16-t") } + @Test func pathsData17F() throws { try compareToReference("paths-data-17-f") } + @Test func pathsData18F() throws { try compareToReference("paths-data-18-f") } + @Test func pathsData19F() throws { try compareToReference("paths-data-19-f") } + @Test func pathsData20F() throws { try compareToReference("paths-data-20-f") } + } + + @Suite("Pservers") + struct Pservers: SVGTestHelper { + var dir: String { "1.1F2" } + + @Test func pserversGrad01B() throws { try compareToReference("pservers-grad-01-b") } + @Test func pserversGrad02B() throws { try compareToReference("pservers-grad-02-b") } + @Test func pserversGrad04B() throws { try compareToReference("pservers-grad-04-b") } + @Test func pserversGrad05B() throws { try compareToReference("pservers-grad-05-b") } + @Test func pserversGrad07B() throws { try compareToReference("pservers-grad-07-b") } + @Test func pserversGrad09B() throws { try compareToReference("pservers-grad-09-b") } + } + + @Suite("Render") + struct Render: SVGTestHelper { + var dir: String { "1.1F2" } + + @Test func renderElems01T() throws { try compareToReference("render-elems-01-t") } + @Test func renderElems02T() throws { try compareToReference("render-elems-02-t") } + @Test func renderElems03T() throws { try compareToReference("render-elems-03-t") } + } + + @Suite("Shapes") + struct Shapes: SVGTestHelper { + var dir: String { "1.1F2" } + + @Test func shapesCircle01T() throws { try compareToReference("shapes-circle-01-t") } + @Test func shapesCircle02T() throws { try compareToReference("shapes-circle-02-t") } + @Test func shapesEllipse01T() throws { try compareToReference("shapes-ellipse-01-t") } + @Test func shapesEllipse02T() throws { try compareToReference("shapes-ellipse-02-t") } + @Test func shapesEllipse03F() throws { try compareToReference("shapes-ellipse-03-f") } + @Test func shapesGrammar01F() throws { try compareToReference("shapes-grammar-01-f") } + @Test func shapesIntro01T() throws { try compareToReference("shapes-intro-01-t") } + @Test func shapesLine01T() throws { try compareToReference("shapes-line-01-t") } + @Test func shapesLine02F() throws { try compareToReference("shapes-line-02-f") } + @Test func shapesPolygon01T() throws { try compareToReference("shapes-polygon-01-t") } + @Test func shapesPolygon02T() throws { try compareToReference("shapes-polygon-02-t") } + @Test func shapesPolygon03T() throws { try compareToReference("shapes-polygon-03-t") } + @Test func shapesPolyline01T() throws { try compareToReference("shapes-polyline-01-t") } + @Test func shapesPolyline02T() throws { try compareToReference("shapes-polyline-02-t") } + @Test func shapesRect02T() throws { try compareToReference("shapes-rect-02-t") } + @Test func shapesRect04F() throws { try compareToReference("shapes-rect-04-f") } + @Test func shapesRect05F() throws { try compareToReference("shapes-rect-05-f") } + @Test func shapesRect06F() throws { try compareToReference("shapes-rect-06-f") } + } + + @Suite("Struct") + struct Struct: SVGTestHelper { + var dir: String { "1.1F2" } + + @Test func structDefs01T() throws { try compareToReference("struct-defs-01-t") } + @Test func structFrag01T() throws { try compareToReference("struct-frag-01-t") } + @Test func structFrag06T() throws { try compareToReference("struct-frag-06-t") } + @Test func structGroup01T() throws { try compareToReference("struct-group-01-t") } + @Test func structImage01T() throws { try compareToReference("struct-image-01-t") } + @Test func structImage04T() throws { try compareToReference("struct-image-04-t") } + @Test func structUse03T() throws { try compareToReference("struct-use-03-t") } + } + + @Suite("Styling") + struct Styling: SVGTestHelper { + var dir: String { "1.1F2" } + + @Test func stylingClass01F() throws { try compareToReference("styling-class-01-f") } + @Test func stylingCss01B() throws { try compareToReference("styling-css-01-b") } + @Test func stylingPres01T() throws { try compareToReference("styling-pres-01-t") } + } + + @Suite("Types") + struct Types: SVGTestHelper { + var dir: String { "1.1F2" } + + @Test func typesBasic01F() throws { try compareToReference("types-basic-01-f") } + } +} diff --git a/Tests/SVGViewTests/SVG12Tests.swift b/Tests/SVGViewTests/SVG12Tests.swift index f5f7c417..243b3454 100644 --- a/Tests/SVGViewTests/SVG12Tests.swift +++ b/Tests/SVGViewTests/SVG12Tests.swift @@ -1,124 +1,58 @@ -// Generated by make generate-test-cases - import Testing @testable import SVGView -struct SVG12Tests: SVGTestHelper { - - var dir: String { - "1.2T" - } - - @Test func coordsTrans01T() throws { - try compareToReference("coords-trans-01-t") - } - - @Test func coordsTrans02T() throws { - try compareToReference("coords-trans-02-t") - } - - @Test func coordsTrans03T() throws { - try compareToReference("coords-trans-03-t") - } - - @Test func coordsTrans04T() throws { - try compareToReference("coords-trans-04-t") - } - - @Test func coordsTrans05T() throws { - try compareToReference("coords-trans-05-t") - } - - @Test func coordsTrans06T() throws { - try compareToReference("coords-trans-06-t") - } - - @Test func coordsTrans07T() throws { - try compareToReference("coords-trans-07-t") - } - - @Test func coordsTrans08T() throws { - try compareToReference("coords-trans-08-t") - } - - @Test func coordsTrans09T() throws { - try compareToReference("coords-trans-09-t") - } - - @Test func paintColor03T() throws { - try compareToReference("paint-color-03-t") - } - - @Test func paintColor201T() throws { - try compareToReference("paint-color-201-t") - } - - @Test func paintFill04T() throws { - try compareToReference("paint-fill-04-t") - } - - @Test func paintFill06T() throws { - try compareToReference("paint-fill-06-t") - } - - @Test func paintStroke01T() throws { - try compareToReference("paint-stroke-01-t") - } - - @Test func pathsData01T() throws { - try compareToReference("paths-data-01-t") - } - - @Test func pathsData02T() throws { - try compareToReference("paths-data-02-t") - } - - @Test func renderElems01T() throws { - try compareToReference("render-elems-01-t") - } - - @Test func renderElems02T() throws { - try compareToReference("render-elems-02-t") - } - - @Test func renderElems03T() throws { - try compareToReference("render-elems-03-t") - } - - @Test func shapesCircle01T() throws { - try compareToReference("shapes-circle-01-t") - } - - @Test func shapesEllipse01T() throws { - try compareToReference("shapes-ellipse-01-t") - } - - @Test func shapesLine01T() throws { - try compareToReference("shapes-line-01-t") - } - - @Test func shapesPolygon01T() throws { - try compareToReference("shapes-polygon-01-t") - } - - @Test func shapesPolyline01T() throws { - try compareToReference("shapes-polyline-01-t") - } - - @Test func shapesRect02T() throws { - try compareToReference("shapes-rect-02-t") - } - - @Test func structDefs01T() throws { - try compareToReference("struct-defs-01-t") - } - - @Test func structFrag01T() throws { - try compareToReference("struct-frag-01-t") - } - - @Test func structUse03T() throws { - try compareToReference("struct-use-03-t") - } - -} \ No newline at end of file +@Suite("SVG 1.2 Tiny") +struct SVG12Tests { + + @Suite("Coords") + struct Coords: SVGTestHelper { + @Test func coordsTrans01T() throws { try compareToReference("coords-trans-01-t") } + @Test func coordsTrans02T() throws { try compareToReference("coords-trans-02-t") } + @Test func coordsTrans03T() throws { try compareToReference("coords-trans-03-t") } + @Test func coordsTrans04T() throws { try compareToReference("coords-trans-04-t") } + @Test func coordsTrans05T() throws { try compareToReference("coords-trans-05-t") } + @Test func coordsTrans06T() throws { try compareToReference("coords-trans-06-t") } + @Test func coordsTrans07T() throws { try compareToReference("coords-trans-07-t") } + @Test func coordsTrans08T() throws { try compareToReference("coords-trans-08-t") } + @Test func coordsTrans09T() throws { try compareToReference("coords-trans-09-t") } + } + + @Suite("Paint") + struct Paint: SVGTestHelper { + @Test func paintColor03T() throws { try compareToReference("paint-color-03-t") } + @Test func paintColor201T() throws { try compareToReference("paint-color-201-t") } + @Test func paintFill04T() throws { try compareToReference("paint-fill-04-t") } + @Test func paintFill06T() throws { try compareToReference("paint-fill-06-t") } + @Test func paintStroke01T() throws { try compareToReference("paint-stroke-01-t") } + } + + @Suite("Paths") + struct Paths: SVGTestHelper { + @Test func pathsData01T() throws { try compareToReference("paths-data-01-t") } + @Test func pathsData02T() throws { try compareToReference("paths-data-02-t") } + } + + @Suite("Render") + struct Render: SVGTestHelper { + @Test func renderElems01T() throws { try compareToReference("render-elems-01-t") } + @Test func renderElems02T() throws { try compareToReference("render-elems-02-t") } + @Test func renderElems03T() throws { try compareToReference("render-elems-03-t") } + } + + @Suite("Shapes") + struct Shapes: SVGTestHelper { + @Test func shapesCircle01T() throws { try compareToReference("shapes-circle-01-t") } + @Test func shapesEllipse01T() throws { try compareToReference("shapes-ellipse-01-t") } + @Test func shapesLine01T() throws { try compareToReference("shapes-line-01-t") } + @Test func shapesPolygon01T() throws { try compareToReference("shapes-polygon-01-t") } + @Test func shapesPolyline01T() throws { try compareToReference("shapes-polyline-01-t") } + @Test func shapesRect02T() throws { try compareToReference("shapes-rect-02-t") } + } + + @Suite("Struct") + struct Struct: SVGTestHelper { + @Test func structDefs01T() throws { try compareToReference("struct-defs-01-t") } + @Test func structFrag01T() throws { try compareToReference("struct-frag-01-t") } + @Test func structUse03T() throws { try compareToReference("struct-use-03-t") } + } +} From 4756590cfdfb45c39186759c9bd7a979b0ca545c Mon Sep 17 00:00:00 2001 From: Mathias Amnell <104110+Amnell@users.noreply.github.com> Date: Sun, 24 May 2026 13:37:37 +0200 Subject: [PATCH 06/19] Add support for struct-cond-01-t and struct-cond-03-t --- GenerateReferencesCLI/cli.swift | 2 + .../SVG/Elements/SVGStructureParsers.swift | 71 +++++++++++++++++++ Source/Parser/SVG/SVGParser.swift | 1 + Tests/SVGViewTests/SVG11Tests.swift | 2 + .../w3c/1.1F2/refs/struct-cond-01-t.ref | 37 ++++++++++ .../w3c/1.1F2/refs/struct-cond-03-t.ref | 51 +++++++++++++ 6 files changed, 164 insertions(+) create mode 100644 Tests/SVGViewTests/w3c/1.1F2/refs/struct-cond-01-t.ref create mode 100644 Tests/SVGViewTests/w3c/1.1F2/refs/struct-cond-03-t.ref diff --git a/GenerateReferencesCLI/cli.swift b/GenerateReferencesCLI/cli.swift index f682ff1f..770c4fba 100644 --- a/GenerateReferencesCLI/cli.swift +++ b/GenerateReferencesCLI/cli.swift @@ -101,6 +101,8 @@ struct cli: ParsableCommand { "shapes-rect-04-f", "shapes-rect-05-f", "shapes-rect-06-f", + "struct-cond-01-t", + "struct-cond-03-t", "struct-defs-01-t", "struct-frag-01-t", "struct-frag-06-t", diff --git a/Source/Parser/SVG/Elements/SVGStructureParsers.swift b/Source/Parser/SVG/Elements/SVGStructureParsers.swift index 1b1bb10b..fcb2685b 100644 --- a/Source/Parser/SVG/Elements/SVGStructureParsers.swift +++ b/Source/Parser/SVG/Elements/SVGStructureParsers.swift @@ -143,3 +143,74 @@ class SVGMarkerParser: SVGBaseElementParser { } } } + +/// Implements the SVG `` element (SVG 1.1 §5.8). +/// +/// The switch evaluates conditional-processing attributes on each child element +/// in document order and renders the first child for which all conditions are +/// met. Subsequent children are ignored. +class SVGSwitchParser: SVGBaseElementParser { + + /// SVG 1.1 feature strings that SVGView supports. + private static let supportedFeatures: Set = [ + "http://www.w3.org/TR/SVG11/feature#SVG-static", + "http://www.w3.org/TR/SVG11/feature#CoreAttribute", + "http://www.w3.org/TR/SVG11/feature#Structure", + "http://www.w3.org/TR/SVG11/feature#BasicStructure", + "http://www.w3.org/TR/SVG11/feature#ConditionalProcessing", + "http://www.w3.org/TR/SVG11/feature#Shape", + "http://www.w3.org/TR/SVG11/feature#BasicText", + "http://www.w3.org/TR/SVG11/feature#PaintAttribute", + "http://www.w3.org/TR/SVG11/feature#BasicPaintAttribute", + "http://www.w3.org/TR/SVG11/feature#OpacityAttribute", + "http://www.w3.org/TR/SVG11/feature#GraphicsAttribute", + "http://www.w3.org/TR/SVG11/feature#BasicGraphicsAttribute", + "http://www.w3.org/TR/SVG11/feature#Gradient", + "http://www.w3.org/TR/SVG11/feature#Marker", + "http://www.w3.org/TR/SVG11/feature#Image", + ] + + override func doParse(context: SVGNodeContext, delegate: (XMLElement) -> SVGNode?) -> SVGNode? { + let children = context.element.contents.compactMap { $0 as? XMLElement } + for child in children { + if conditionsMet(for: child) { + let contents = delegate(child).map { [$0] } ?? [] + return SVGGroup(contents: contents) + } + } + return SVGGroup(contents: []) + } + + private func conditionsMet(for element: XMLElement) -> Bool { + let attrs = element.attributes + + // requiredExtensions: SVGView supports no extensions — any non-empty value skips the child + if let extensions = attrs["requiredExtensions"], !extensions.trimmingCharacters(in: .whitespaces).isEmpty { + return false + } + + // requiredFeatures: every space-separated feature URI must be in our supported set + if let features = attrs["requiredFeatures"] { + let required = features.split(separator: " ").map(String.init) + if !required.allSatisfy({ Self.supportedFeatures.contains($0) }) { + return false + } + } + + // systemLanguage: at least one comma-separated BCP-47 tag must prefix-match the current locale + if let languages = attrs["systemLanguage"] { + let currentLang: String + if #available(macOS 13, iOS 16, watchOS 9, *) { + currentLang = Locale.current.language.languageCode?.identifier ?? "" + } else { + currentLang = (Locale.current as NSLocale).languageCode + } + let codes = languages.split(separator: ",").map { $0.trimmingCharacters(in: .whitespaces) } + if !codes.contains(where: { $0.hasPrefix(currentLang) || currentLang.hasPrefix($0) }) { + return false + } + } + + return true + } +} diff --git a/Source/Parser/SVG/SVGParser.swift b/Source/Parser/SVG/SVGParser.swift index 1c11de2e..74a72efb 100644 --- a/Source/Parser/SVG/SVGParser.swift +++ b/Source/Parser/SVG/SVGParser.swift @@ -65,6 +65,7 @@ public struct SVGParser { "path": SVGPathParser(), "marker": SVGMarkerParser(), "defs": SVGVDefParser(), + "switch": SVGSwitchParser(), ] private static func parse(context: SVGNodeContext) -> SVGNode? { diff --git a/Tests/SVGViewTests/SVG11Tests.swift b/Tests/SVGViewTests/SVG11Tests.swift index b7b6f1bf..11d381c7 100644 --- a/Tests/SVGViewTests/SVG11Tests.swift +++ b/Tests/SVGViewTests/SVG11Tests.swift @@ -147,6 +147,8 @@ struct SVG11Tests { struct Struct: SVGTestHelper { var dir: String { "1.1F2" } + @Test func structCond01T() throws { try compareToReference("struct-cond-01-t") } + @Test func structCond03T() throws { try compareToReference("struct-cond-03-t") } @Test func structDefs01T() throws { try compareToReference("struct-defs-01-t") } @Test func structFrag01T() throws { try compareToReference("struct-frag-01-t") } @Test func structFrag06T() throws { try compareToReference("struct-frag-06-t") } diff --git a/Tests/SVGViewTests/w3c/1.1F2/refs/struct-cond-01-t.ref b/Tests/SVGViewTests/w3c/1.1F2/refs/struct-cond-01-t.ref new file mode 100644 index 00000000..e037184b --- /dev/null +++ b/Tests/SVGViewTests/w3c/1.1F2/refs/struct-cond-01-t.ref @@ -0,0 +1,37 @@ +SVGViewport { + id: "svg-root", + viewBox: { width: 480, height: 360 }, + scaling: "none", + contents: [ + SVGDefs { }, + SVGGroup { + id: "test-body-content", + contents: [ + SVGGroup { + contents: [ + SVGRect { y: 150, width: 220, height: 150, fill: "green" } + ] + } + ] + }, + SVGGroup { + contents: [ + SVGText { + id: "revision", + text: "$Revision: 1.5 $", + font: { name: "SVGFreeSansASCII,sans-serif", size: 32 }, + fill: "black", + transform: [1, 0, 0, 1, 10, 340] + } + ] + }, + SVGRect { + id: "test-frame", + x: 1, + y: 1, + width: 478, + height: 358, + stroke: { fill: "black" } + } + ] +} diff --git a/Tests/SVGViewTests/w3c/1.1F2/refs/struct-cond-03-t.ref b/Tests/SVGViewTests/w3c/1.1F2/refs/struct-cond-03-t.ref new file mode 100644 index 00000000..717753ec --- /dev/null +++ b/Tests/SVGViewTests/w3c/1.1F2/refs/struct-cond-03-t.ref @@ -0,0 +1,51 @@ +SVGViewport { + id: "svg-root", + viewBox: { width: 480, height: 360 }, + scaling: "none", + contents: [ + SVGDefs { }, + SVGGroup { + id: "test-body-content", + contents: [ + SVGGroup { + contents: [ + SVGGroup { + contents: [ + SVGRect { x: 30, y: 20, width: 420, height: 130, fill: "lime" } + ] + } + ] + }, + SVGGroup { + transform: [1, 0, 0, 1, 0, 140], + contents: [ + SVGGroup { + contents: [ + SVGRect { x: 30, y: 20, width: 420, height: 130, fill: "lime" } + ] + } + ] + } + ] + }, + SVGGroup { + contents: [ + SVGText { + id: "revision", + text: "$Revision: 1.7 $", + font: { name: "SVGFreeSansASCII,sans-serif", size: 32 }, + fill: "black", + transform: [1, 0, 0, 1, 10, 340] + } + ] + }, + SVGRect { + id: "test-frame", + x: 1, + y: 1, + width: 478, + height: 358, + stroke: { fill: "black" } + } + ] +} From 13972e5798425706e76ae2bcd98b10cafe2bf17e Mon Sep 17 00:00:00 2001 From: Mathias Amnell <104110+Amnell@users.noreply.github.com> Date: Sun, 24 May 2026 13:40:34 +0200 Subject: [PATCH 07/19] Create makefile helper for w3c-coverage bash script --- Makefile | 5 ++++- w3c-coverage.sh | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 8c6b3fff..b08b54d6 100644 --- a/Makefile +++ b/Makefile @@ -45,4 +45,7 @@ generate-test-cases: # Generate test cases from w3c reference files update-references-snapshots: # Update .ref from .svg files swift run GenerateReferencesCLI Tests/SVGViewTests/w3c/ -.PHONY: help test generate-test-cases update-references-snapshots +w3c-coverage: # Regenerate w3c-coverage.md + ./w3c-coverage.sh + +.PHONY: help test generate-test-cases update-references-snapshots w3c-coverage diff --git a/w3c-coverage.sh b/w3c-coverage.sh index 4e77650d..eb677e97 100755 --- a/w3c-coverage.sh +++ b/w3c-coverage.sh @@ -1,6 +1,6 @@ #!/bin/sh -BASE_DIR="SVGViewTests" +BASE_DIR="Tests/SVGViewTests" cd $BASE_DIR HEADER="# W3C SVG Test Suite Coverage\n\n" @@ -63,4 +63,4 @@ function addSubTitle() { addTitle "1.1F2" "SVG 1.1 (Second Edition)" "svg-11-second-edition" "https://www.w3.org/TR/SVG11/" "1" addTitle "1.2T" "SVG Tiny 1.2" "svg-tiny-12" "https://www.w3.org/TR/SVGTiny12/" "2" -echo "$HEADER$FOOTER" > ../w3c-coverage.md +echo "$HEADER$FOOTER" > ../../w3c-coverage.md From 55f62f0e128560d73310f2a9244321a8672bd336 Mon Sep 17 00:00:00 2001 From: Mathias Amnell <104110+Amnell@users.noreply.github.com> Date: Sun, 24 May 2026 13:42:00 +0200 Subject: [PATCH 08/19] Add CONTRIBUTING and update README --- CONTRIBUTING.md | 199 ++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 2 + 2 files changed, 201 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..0bd51c34 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,199 @@ +# Contributing: Implementing SVG Spec Features + +This guide walks through the end-to-end process of identifying a missing SVG feature, implementing it, and verifying it with tests. It is written for both humans and AI agents. + +--- + +## 1. Find an uncovered feature + +Open [`w3c-coverage.md`](w3c-coverage.md). Each section lists W3C conformance tests with ✅ (covered) or ❌ (not yet covered). Look for a category with low coverage and pick a failing test whose description sounds tractable — prefer tests that: + +- Use only elements and attributes (no scripting or DOM interaction) +- Have a clear, deterministic pass criterion ("no red on the page", "one green rectangle") +- Aren't dependent on font rendering, animation, or system state + +Read the SVG source file for that test to understand exactly what it exercises: + +``` +Tests/SVGViewTests/w3c/1.1F2/svg/.svg +``` + +--- + +## 2. Trace the code path + +SVGView's parser pipeline: + +``` +XML bytes + → DOMParser (Source/Parser/XML/DOMParser.swift) + → XMLElement tree + → SVGParser (Source/Parser/SVG/SVGParser.swift) + looks up element name in `parsers` dictionary + calls the matching SVGElementParser + → SVGNode model (Source/Model/) + → Serializer (Source/Serialization/Serializer.swift) + → .ref snapshot string +``` + +Key files to check: + +| File | What to look at | +|------|----------------| +| `SVGParser.swift` | The `parsers` dictionary — if the element name is missing, add an entry | +| `SVGStructureParsers.swift` | Group/Use/Viewport/Switch parsers | +| `SVGShapeParser.swift` | Shape element parsers | +| `SVGElementParser.swift` | `SVGBaseElementParser` — common attribute handling (transform, opacity, clip, markers) | +| `SVGContext.swift` | `SVGNodeContext` — how style and property attributes are resolved | +| `SVGConstants.swift` | `availableStyleAttributes` — CSS properties SVGView recognises | +| `Source/Model/` | The node model classes — add a new model class here if needed | +| `Source/Serialization/Serializations.swift` | Add serialization for any new model fields | + +### Example trace: `` was missing + +1. `struct-cond-01-t.svg` used `` — not in `parsers` dictionary → silently dropped +2. Added `SVGSwitchParser` to `SVGStructureParsers.swift` +3. Registered `"switch": SVGSwitchParser()` in `SVGParser.swift` + +--- + +## 3. Implement the parser + +### Adding a parser for an unknown element + +If the element produces a renderable node: + +1. Subclass `SVGBaseElementParser` and override `doParse(context:delegate:)` +2. Read attributes from `context.properties` (non-style) or via `context.value(_:)` (style) +3. Return the appropriate `SVGNode` subclass (or a new one if needed) +4. Register the parser in `SVGParser.parsers` + +```swift +// SVGStructureParsers.swift +class SVGMyFeatureParser: SVGBaseElementParser { + override func doParse(context: SVGNodeContext, delegate: (XMLElement) -> SVGNode?) -> SVGNode? { + let attrs = context.properties + // parse attributes, call delegate() for child elements + return SVGGroup(contents: parseContents(context: context, delegate: delegate)) + } +} + +// SVGParser.swift (add to parsers dict) +"myelement": SVGMyFeatureParser(), +``` + +### Adding support for a new attribute on existing elements + +Most style attributes flow through `SVGContext`. To support a new one: + +1. Add the attribute name string to `SVGConstants.availableStyleAttributes` +2. Add a property to the relevant `SVGNode` subclass (with `@Published` on non-Linux) +3. Read it in the element's parser via `context.styles["attribute-name"]` +4. Serialize it in `Serializations.swift` + +--- + +## 4. Add the test + +### Add to the test file + +Tests live in `Tests/SVGViewTests/SVG11Tests.swift` or `SVG12Tests.swift`, organised in nested `@Suite` structs by category: + +```swift +@Suite("Struct") +struct Struct: SVGTestHelper { + var dir: String { "1.1F2" } + + @Test func myNewTest() throws { try compareToReference("my-test-name") } +} +``` + +Use the exact W3C file name (without `.svg`) as the argument to `compareToReference`. + +### Add to the CLI snapshot list + +Open `GenerateReferencesCLI/cli.swift` and add the test name to `v11Refs` (or `v12Refs`): + +```swift +static let v11Refs: [String] = [ + // ... + "my-test-name", + // ... +] +``` + +Keep the list alphabetical within each category block. + +--- + +## 5. Generate the reference snapshot + +Run the CLI to parse the SVG with the new parser code and write the `.ref` file: + +```bash +swift run GenerateReferencesCLI Tests/SVGViewTests/w3c/ +``` + +Or via Make: + +```bash +make update-references-snapshots +``` + +This only works on macOS (the CLI is wrapped in `#if os(macOS)`). The output files land in: + +``` +Tests/SVGViewTests/w3c/1.1F2/refs/.ref +Tests/SVGViewTests/w3c/1.2T/refs/.ref +``` + +**Inspect the generated `.ref` before committing.** The serialized tree should reflect what you expect — correct elements selected, ignored, or transformed. If it looks wrong, fix the parser and re-run. + +--- + +## 6. Run the tests + +```bash +# via Xcode / xcodebuild +xcodebuild test -scheme SVGView-Package +``` + +Or use the Xcode MCP tool: + +``` +RunAllTests(tabIdentifier: "windowtab3") +``` + +All previously-passing tests must still pass, and the new ones must pass too. + +--- + +## 7. Update the coverage report + +```bash +make w3c-coverage +``` + +This regenerates `w3c-coverage.md` by counting `.ref` files vs `.svg` files. Commit it alongside the code change. + +--- + +## Checklist + +- [ ] Feature traced to a specific missing parser or attribute +- [ ] Parser implemented and registered +- [ ] Test name added to `SVG11Tests.swift` / `SVG12Tests.swift` +- [ ] Test name added to `cli.swift` `v11Refs` / `v12Refs` +- [ ] `.ref` file generated and inspected +- [ ] All tests pass +- [ ] `w3c-coverage.md` regenerated + +--- + +## Tips + +- **Start with `requiredExtensions`/`requiredFeatures` tests** — they are fully deterministic and don't depend on fonts, system language, or platform-specific color values. +- **Avoid `systemLanguage` tests** as a first target — the expected output depends on the system locale, making snapshot tests environment-sensitive. +- **The `.ref` file is the ground truth.** If you generate it with a broken parser, the test will pass but cover nothing. Always read the ref and confirm it matches the spec's pass criteria. +- **`SVGBaseElementParser.parse()`** already handles `transform`, `opacity`, `clip-path`, `id`, and markers for every element. Your `doParse()` only needs to handle element-specific attributes. +- **Serialization drives the tests**, not rendering. An element that parses correctly but serializes nothing will not be caught by these tests. Check `Serializations.swift` to ensure new model fields are serialized. diff --git a/README.md b/README.md index 0c482143..be09f421 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,8 @@ This is a fork of [exyte/SVGView](https://github.com/exyte/SVGView) that tailore This uses `make` heavily for relevant scripts. Run `make` without arguments to see the available commands. +See [CONTRIBUTING.md](CONTRIBUTING.md) for a step-by-step guide on identifying missing SVG spec features and implementing them, including how to write tests and generate reference snapshots. + ## To add a new SVG test: - Update `cli.swift` to include the svg file path - `make generate-test-cases` to generate the unit test files From 790900f0c5eee7cb0d2000f55be65d04ea246bd0 Mon Sep 17 00:00:00 2001 From: Mathias Amnell <104110+Amnell@users.noreply.github.com> Date: Sun, 24 May 2026 13:42:14 +0200 Subject: [PATCH 09/19] Update w3c-coverage.md with new baseline --- w3c-coverage.md | 2238 +++++++++++++++++++++++------------------------ 1 file changed, 1119 insertions(+), 1119 deletions(-) diff --git a/w3c-coverage.md b/w3c-coverage.md index fa0af1cd..d3328f28 100644 --- a/w3c-coverage.md +++ b/w3c-coverage.md @@ -2,7 +2,7 @@ This page is automatically generated and shows actual coverage of the [W3C SVG Test Suite](https://github.com/web-platform-tests/wpt/tree/master/svg) by this `SVGView` implementation. Currently there are two standards supported: [SVG 1.1 (Second Edition)](https://www.w3.org/TR/SVG11/) and [SVG Tiny 1.2](https://www.w3.org/TR/SVGTiny12/). - * [SVG 1.1 (Second Edition)](#svg-11-second-edition): `19.5%` + * [SVG 1.1 (Second Edition)](#svg-11-second-edition): `19.9%` * [Animate](#animate-1): `0.0%` * [Color](#color-1): `83.3%` * [Conform](#conform-1): `0.0%` @@ -21,7 +21,7 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T * [Render](#render-1): `37.5%` * [Script](#script-1): `0.0%` * [Shapes](#shapes-1): `81.8%` - * [Struct](#struct-1): `9.7%` + * [Struct](#struct-1): `12.5%` * [Styling](#styling-1): `16.6%` * [Svgdom](#svgdom-1): `0.0%` * [Text](#text-1): `0.0%` @@ -51,7 +51,7 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T ## [SVG 1.1 (Second Edition)](https://www.w3.org/TR/SVG11/) -`19.5%` of tests covered (102/522). They can be splitted into following categories: +`19.9%` of tests covered (104/522). They can be splitted into following categories: ### [Animate](https://www.w3.org/TR/SVG11/animate.html): `0.0%` @@ -60,84 +60,84 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[animate-dom-01-f](SVGViewTests/w3c/1.1F2/svg/animate-dom-01-f.svg)| -|❌|[animate-dom-02-f](SVGViewTests/w3c/1.1F2/svg/animate-dom-02-f.svg)| -|❌|[animate-elem-02-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-02-t.svg)| -|❌|[animate-elem-03-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-03-t.svg)| -|❌|[animate-elem-04-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-04-t.svg)| -|❌|[animate-elem-05-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-05-t.svg)| -|❌|[animate-elem-06-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-06-t.svg)| -|❌|[animate-elem-07-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-07-t.svg)| -|❌|[animate-elem-08-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-08-t.svg)| -|❌|[animate-elem-09-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-09-t.svg)| -|❌|[animate-elem-10-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-10-t.svg)| -|❌|[animate-elem-11-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-11-t.svg)| -|❌|[animate-elem-12-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-12-t.svg)| -|❌|[animate-elem-13-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-13-t.svg)| -|❌|[animate-elem-14-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-14-t.svg)| -|❌|[animate-elem-15-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-15-t.svg)| -|❌|[animate-elem-17-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-17-t.svg)| -|❌|[animate-elem-19-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-19-t.svg)| -|❌|[animate-elem-20-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-20-t.svg)| -|❌|[animate-elem-21-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-21-t.svg)| -|❌|[animate-elem-22-b](SVGViewTests/w3c/1.1F2/svg/animate-elem-22-b.svg)| -|❌|[animate-elem-23-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-23-t.svg)| -|❌|[animate-elem-24-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-24-t.svg)| -|❌|[animate-elem-25-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-25-t.svg)| -|❌|[animate-elem-26-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-26-t.svg)| -|❌|[animate-elem-27-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-27-t.svg)| -|❌|[animate-elem-28-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-28-t.svg)| -|❌|[animate-elem-29-b](SVGViewTests/w3c/1.1F2/svg/animate-elem-29-b.svg)| -|❌|[animate-elem-30-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-30-t.svg)| -|❌|[animate-elem-31-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-31-t.svg)| -|❌|[animate-elem-32-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-32-t.svg)| -|❌|[animate-elem-33-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-33-t.svg)| -|❌|[animate-elem-34-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-34-t.svg)| -|❌|[animate-elem-35-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-35-t.svg)| -|❌|[animate-elem-36-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-36-t.svg)| -|❌|[animate-elem-37-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-37-t.svg)| -|❌|[animate-elem-38-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-38-t.svg)| -|❌|[animate-elem-39-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-39-t.svg)| -|❌|[animate-elem-40-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-40-t.svg)| -|❌|[animate-elem-41-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-41-t.svg)| -|❌|[animate-elem-44-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-44-t.svg)| -|❌|[animate-elem-46-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-46-t.svg)| -|❌|[animate-elem-52-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-52-t.svg)| -|❌|[animate-elem-53-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-53-t.svg)| -|❌|[animate-elem-60-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-60-t.svg)| -|❌|[animate-elem-61-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-61-t.svg)| -|❌|[animate-elem-62-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-62-t.svg)| -|❌|[animate-elem-63-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-63-t.svg)| -|❌|[animate-elem-64-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-64-t.svg)| -|❌|[animate-elem-65-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-65-t.svg)| -|❌|[animate-elem-66-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-66-t.svg)| -|❌|[animate-elem-67-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-67-t.svg)| -|❌|[animate-elem-68-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-68-t.svg)| -|❌|[animate-elem-69-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-69-t.svg)| -|❌|[animate-elem-70-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-70-t.svg)| -|❌|[animate-elem-77-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-77-t.svg)| -|❌|[animate-elem-78-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-78-t.svg)| -|❌|[animate-elem-80-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-80-t.svg)| -|❌|[animate-elem-81-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-81-t.svg)| -|❌|[animate-elem-82-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-82-t.svg)| -|❌|[animate-elem-83-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-83-t.svg)| -|❌|[animate-elem-84-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-84-t.svg)| -|❌|[animate-elem-85-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-85-t.svg)| -|❌|[animate-elem-86-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-86-t.svg)| -|❌|[animate-elem-87-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-87-t.svg)| -|❌|[animate-elem-88-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-88-t.svg)| -|❌|[animate-elem-89-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-89-t.svg)| -|❌|[animate-elem-90-b](SVGViewTests/w3c/1.1F2/svg/animate-elem-90-b.svg)| -|❌|[animate-elem-91-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-91-t.svg)| -|❌|[animate-elem-92-t](SVGViewTests/w3c/1.1F2/svg/animate-elem-92-t.svg)| -|❌|[animate-interact-events-01-t](SVGViewTests/w3c/1.1F2/svg/animate-interact-events-01-t.svg)| -|❌|[animate-interact-pevents-01-t](SVGViewTests/w3c/1.1F2/svg/animate-interact-pevents-01-t.svg)| -|❌|[animate-interact-pevents-02-t](SVGViewTests/w3c/1.1F2/svg/animate-interact-pevents-02-t.svg)| -|❌|[animate-interact-pevents-03-t](SVGViewTests/w3c/1.1F2/svg/animate-interact-pevents-03-t.svg)| -|❌|[animate-interact-pevents-04-t](SVGViewTests/w3c/1.1F2/svg/animate-interact-pevents-04-t.svg)| -|❌|[animate-pservers-grad-01-b](SVGViewTests/w3c/1.1F2/svg/animate-pservers-grad-01-b.svg)| -|❌|[animate-script-elem-01-b](SVGViewTests/w3c/1.1F2/svg/animate-script-elem-01-b.svg)| -|❌|[animate-struct-dom-01-b](SVGViewTests/w3c/1.1F2/svg/animate-struct-dom-01-b.svg)| +|❌|[animate-dom-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/animate-dom-01-f.svg)| +|❌|[animate-dom-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/animate-dom-02-f.svg)| +|❌|[animate-elem-02-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-02-t.svg)| +|❌|[animate-elem-03-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-03-t.svg)| +|❌|[animate-elem-04-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-04-t.svg)| +|❌|[animate-elem-05-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-05-t.svg)| +|❌|[animate-elem-06-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-06-t.svg)| +|❌|[animate-elem-07-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-07-t.svg)| +|❌|[animate-elem-08-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-08-t.svg)| +|❌|[animate-elem-09-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-09-t.svg)| +|❌|[animate-elem-10-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-10-t.svg)| +|❌|[animate-elem-11-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-11-t.svg)| +|❌|[animate-elem-12-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-12-t.svg)| +|❌|[animate-elem-13-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-13-t.svg)| +|❌|[animate-elem-14-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-14-t.svg)| +|❌|[animate-elem-15-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-15-t.svg)| +|❌|[animate-elem-17-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-17-t.svg)| +|❌|[animate-elem-19-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-19-t.svg)| +|❌|[animate-elem-20-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-20-t.svg)| +|❌|[animate-elem-21-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-21-t.svg)| +|❌|[animate-elem-22-b](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-22-b.svg)| +|❌|[animate-elem-23-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-23-t.svg)| +|❌|[animate-elem-24-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-24-t.svg)| +|❌|[animate-elem-25-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-25-t.svg)| +|❌|[animate-elem-26-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-26-t.svg)| +|❌|[animate-elem-27-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-27-t.svg)| +|❌|[animate-elem-28-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-28-t.svg)| +|❌|[animate-elem-29-b](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-29-b.svg)| +|❌|[animate-elem-30-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-30-t.svg)| +|❌|[animate-elem-31-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-31-t.svg)| +|❌|[animate-elem-32-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-32-t.svg)| +|❌|[animate-elem-33-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-33-t.svg)| +|❌|[animate-elem-34-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-34-t.svg)| +|❌|[animate-elem-35-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-35-t.svg)| +|❌|[animate-elem-36-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-36-t.svg)| +|❌|[animate-elem-37-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-37-t.svg)| +|❌|[animate-elem-38-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-38-t.svg)| +|❌|[animate-elem-39-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-39-t.svg)| +|❌|[animate-elem-40-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-40-t.svg)| +|❌|[animate-elem-41-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-41-t.svg)| +|❌|[animate-elem-44-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-44-t.svg)| +|❌|[animate-elem-46-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-46-t.svg)| +|❌|[animate-elem-52-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-52-t.svg)| +|❌|[animate-elem-53-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-53-t.svg)| +|❌|[animate-elem-60-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-60-t.svg)| +|❌|[animate-elem-61-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-61-t.svg)| +|❌|[animate-elem-62-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-62-t.svg)| +|❌|[animate-elem-63-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-63-t.svg)| +|❌|[animate-elem-64-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-64-t.svg)| +|❌|[animate-elem-65-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-65-t.svg)| +|❌|[animate-elem-66-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-66-t.svg)| +|❌|[animate-elem-67-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-67-t.svg)| +|❌|[animate-elem-68-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-68-t.svg)| +|❌|[animate-elem-69-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-69-t.svg)| +|❌|[animate-elem-70-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-70-t.svg)| +|❌|[animate-elem-77-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-77-t.svg)| +|❌|[animate-elem-78-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-78-t.svg)| +|❌|[animate-elem-80-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-80-t.svg)| +|❌|[animate-elem-81-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-81-t.svg)| +|❌|[animate-elem-82-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-82-t.svg)| +|❌|[animate-elem-83-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-83-t.svg)| +|❌|[animate-elem-84-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-84-t.svg)| +|❌|[animate-elem-85-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-85-t.svg)| +|❌|[animate-elem-86-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-86-t.svg)| +|❌|[animate-elem-87-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-87-t.svg)| +|❌|[animate-elem-88-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-88-t.svg)| +|❌|[animate-elem-89-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-89-t.svg)| +|❌|[animate-elem-90-b](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-90-b.svg)| +|❌|[animate-elem-91-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-91-t.svg)| +|❌|[animate-elem-92-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-elem-92-t.svg)| +|❌|[animate-interact-events-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-interact-events-01-t.svg)| +|❌|[animate-interact-pevents-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-interact-pevents-01-t.svg)| +|❌|[animate-interact-pevents-02-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-interact-pevents-02-t.svg)| +|❌|[animate-interact-pevents-03-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-interact-pevents-03-t.svg)| +|❌|[animate-interact-pevents-04-t](Tests/SVGViewTests/w3c/1.1F2/svg/animate-interact-pevents-04-t.svg)| +|❌|[animate-pservers-grad-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/animate-pservers-grad-01-b.svg)| +|❌|[animate-script-elem-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/animate-script-elem-01-b.svg)| +|❌|[animate-struct-dom-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/animate-struct-dom-01-b.svg)| ### [Color](https://www.w3.org/TR/SVG11/color.html): `83.3%` @@ -147,12 +147,12 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[color-prof-01-f](SVGViewTests/w3c/1.1F2/svg/color-prof-01-f.svg)| -|✅|[color-prop-01-b](SVGViewTests/w3c/1.1F2/svg/color-prop-01-b.svg)| -|✅|[color-prop-02-f](SVGViewTests/w3c/1.1F2/svg/color-prop-02-f.svg)| -|✅|[color-prop-03-t](SVGViewTests/w3c/1.1F2/svg/color-prop-03-t.svg)| -|✅|[color-prop-04-t](SVGViewTests/w3c/1.1F2/svg/color-prop-04-t.svg)| -|✅|[color-prop-05-t](SVGViewTests/w3c/1.1F2/svg/color-prop-05-t.svg)| +|❌|[color-prof-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/color-prof-01-f.svg)| +|✅|[color-prop-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/color-prop-01-b.svg)| +|✅|[color-prop-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/color-prop-02-f.svg)| +|✅|[color-prop-03-t](Tests/SVGViewTests/w3c/1.1F2/svg/color-prop-03-t.svg)| +|✅|[color-prop-04-t](Tests/SVGViewTests/w3c/1.1F2/svg/color-prop-04-t.svg)| +|✅|[color-prop-05-t](Tests/SVGViewTests/w3c/1.1F2/svg/color-prop-05-t.svg)| ### [Conform](https://www.w3.org/TR/SVG11/conform.html): `0.0%` @@ -162,9 +162,9 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[conform-viewers-01-t](SVGViewTests/w3c/1.1F2/svg/conform-viewers-01-t.svgz)| -|❌|[conform-viewers-02-f](SVGViewTests/w3c/1.1F2/svg/conform-viewers-02-f.svg)| -|❌|[conform-viewers-03-f](SVGViewTests/w3c/1.1F2/svg/conform-viewers-03-f.svg)| +|❌|[conform-viewers-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/conform-viewers-01-t.svgz)| +|❌|[conform-viewers-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/conform-viewers-02-f.svg)| +|❌|[conform-viewers-03-f](Tests/SVGViewTests/w3c/1.1F2/svg/conform-viewers-03-f.svg)| ### [Coords](https://www.w3.org/TR/SVG11/coords.html): `71.8%` @@ -174,38 +174,38 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|✅|[coords-coord-01-t](SVGViewTests/w3c/1.1F2/svg/coords-coord-01-t.svg)| -|✅|[coords-coord-02-t](SVGViewTests/w3c/1.1F2/svg/coords-coord-02-t.svg)| -|❌|[coords-dom-01-f](SVGViewTests/w3c/1.1F2/svg/coords-dom-01-f.svg)| -|❌|[coords-dom-02-f](SVGViewTests/w3c/1.1F2/svg/coords-dom-02-f.svg)| -|❌|[coords-dom-03-f](SVGViewTests/w3c/1.1F2/svg/coords-dom-03-f.svg)| -|❌|[coords-dom-04-f](SVGViewTests/w3c/1.1F2/svg/coords-dom-04-f.svg)| -|✅|[coords-trans-01-b](SVGViewTests/w3c/1.1F2/svg/coords-trans-01-b.svg)| -|✅|[coords-trans-02-t](SVGViewTests/w3c/1.1F2/svg/coords-trans-02-t.svg)| -|✅|[coords-trans-03-t](SVGViewTests/w3c/1.1F2/svg/coords-trans-03-t.svg)| -|✅|[coords-trans-04-t](SVGViewTests/w3c/1.1F2/svg/coords-trans-04-t.svg)| -|✅|[coords-trans-05-t](SVGViewTests/w3c/1.1F2/svg/coords-trans-05-t.svg)| -|✅|[coords-trans-06-t](SVGViewTests/w3c/1.1F2/svg/coords-trans-06-t.svg)| -|✅|[coords-trans-07-t](SVGViewTests/w3c/1.1F2/svg/coords-trans-07-t.svg)| -|✅|[coords-trans-08-t](SVGViewTests/w3c/1.1F2/svg/coords-trans-08-t.svg)| -|✅|[coords-trans-09-t](SVGViewTests/w3c/1.1F2/svg/coords-trans-09-t.svg)| -|✅|[coords-trans-10-f](SVGViewTests/w3c/1.1F2/svg/coords-trans-10-f.svg)| -|✅|[coords-trans-11-f](SVGViewTests/w3c/1.1F2/svg/coords-trans-11-f.svg)| -|✅|[coords-trans-12-f](SVGViewTests/w3c/1.1F2/svg/coords-trans-12-f.svg)| -|✅|[coords-trans-13-f](SVGViewTests/w3c/1.1F2/svg/coords-trans-13-f.svg)| -|✅|[coords-trans-14-f](SVGViewTests/w3c/1.1F2/svg/coords-trans-14-f.svg)| -|✅|[coords-transformattr-01-f](SVGViewTests/w3c/1.1F2/svg/coords-transformattr-01-f.svg)| -|✅|[coords-transformattr-02-f](SVGViewTests/w3c/1.1F2/svg/coords-transformattr-02-f.svg)| -|✅|[coords-transformattr-03-f](SVGViewTests/w3c/1.1F2/svg/coords-transformattr-03-f.svg)| -|✅|[coords-transformattr-04-f](SVGViewTests/w3c/1.1F2/svg/coords-transformattr-04-f.svg)| -|✅|[coords-transformattr-05-f](SVGViewTests/w3c/1.1F2/svg/coords-transformattr-05-f.svg)| -|❌|[coords-units-01-b](SVGViewTests/w3c/1.1F2/svg/coords-units-01-b.svg)| -|✅|[coords-units-02-b](SVGViewTests/w3c/1.1F2/svg/coords-units-02-b.svg)| -|✅|[coords-units-03-b](SVGViewTests/w3c/1.1F2/svg/coords-units-03-b.svg)| -|❌|[coords-viewattr-01-b](SVGViewTests/w3c/1.1F2/svg/coords-viewattr-01-b.svg)| -|❌|[coords-viewattr-02-b](SVGViewTests/w3c/1.1F2/svg/coords-viewattr-02-b.svg)| -|❌|[coords-viewattr-03-b](SVGViewTests/w3c/1.1F2/svg/coords-viewattr-03-b.svg)| -|❌|[coords-viewattr-04-f](SVGViewTests/w3c/1.1F2/svg/coords-viewattr-04-f.svg)| +|✅|[coords-coord-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/coords-coord-01-t.svg)| +|✅|[coords-coord-02-t](Tests/SVGViewTests/w3c/1.1F2/svg/coords-coord-02-t.svg)| +|❌|[coords-dom-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/coords-dom-01-f.svg)| +|❌|[coords-dom-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/coords-dom-02-f.svg)| +|❌|[coords-dom-03-f](Tests/SVGViewTests/w3c/1.1F2/svg/coords-dom-03-f.svg)| +|❌|[coords-dom-04-f](Tests/SVGViewTests/w3c/1.1F2/svg/coords-dom-04-f.svg)| +|✅|[coords-trans-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/coords-trans-01-b.svg)| +|✅|[coords-trans-02-t](Tests/SVGViewTests/w3c/1.1F2/svg/coords-trans-02-t.svg)| +|✅|[coords-trans-03-t](Tests/SVGViewTests/w3c/1.1F2/svg/coords-trans-03-t.svg)| +|✅|[coords-trans-04-t](Tests/SVGViewTests/w3c/1.1F2/svg/coords-trans-04-t.svg)| +|✅|[coords-trans-05-t](Tests/SVGViewTests/w3c/1.1F2/svg/coords-trans-05-t.svg)| +|✅|[coords-trans-06-t](Tests/SVGViewTests/w3c/1.1F2/svg/coords-trans-06-t.svg)| +|✅|[coords-trans-07-t](Tests/SVGViewTests/w3c/1.1F2/svg/coords-trans-07-t.svg)| +|✅|[coords-trans-08-t](Tests/SVGViewTests/w3c/1.1F2/svg/coords-trans-08-t.svg)| +|✅|[coords-trans-09-t](Tests/SVGViewTests/w3c/1.1F2/svg/coords-trans-09-t.svg)| +|✅|[coords-trans-10-f](Tests/SVGViewTests/w3c/1.1F2/svg/coords-trans-10-f.svg)| +|✅|[coords-trans-11-f](Tests/SVGViewTests/w3c/1.1F2/svg/coords-trans-11-f.svg)| +|✅|[coords-trans-12-f](Tests/SVGViewTests/w3c/1.1F2/svg/coords-trans-12-f.svg)| +|✅|[coords-trans-13-f](Tests/SVGViewTests/w3c/1.1F2/svg/coords-trans-13-f.svg)| +|✅|[coords-trans-14-f](Tests/SVGViewTests/w3c/1.1F2/svg/coords-trans-14-f.svg)| +|✅|[coords-transformattr-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/coords-transformattr-01-f.svg)| +|✅|[coords-transformattr-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/coords-transformattr-02-f.svg)| +|✅|[coords-transformattr-03-f](Tests/SVGViewTests/w3c/1.1F2/svg/coords-transformattr-03-f.svg)| +|✅|[coords-transformattr-04-f](Tests/SVGViewTests/w3c/1.1F2/svg/coords-transformattr-04-f.svg)| +|✅|[coords-transformattr-05-f](Tests/SVGViewTests/w3c/1.1F2/svg/coords-transformattr-05-f.svg)| +|❌|[coords-units-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/coords-units-01-b.svg)| +|✅|[coords-units-02-b](Tests/SVGViewTests/w3c/1.1F2/svg/coords-units-02-b.svg)| +|✅|[coords-units-03-b](Tests/SVGViewTests/w3c/1.1F2/svg/coords-units-03-b.svg)| +|❌|[coords-viewattr-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/coords-viewattr-01-b.svg)| +|❌|[coords-viewattr-02-b](Tests/SVGViewTests/w3c/1.1F2/svg/coords-viewattr-02-b.svg)| +|❌|[coords-viewattr-03-b](Tests/SVGViewTests/w3c/1.1F2/svg/coords-viewattr-03-b.svg)| +|❌|[coords-viewattr-04-f](Tests/SVGViewTests/w3c/1.1F2/svg/coords-viewattr-04-f.svg)| ### [Extend](https://www.w3.org/TR/SVG11/extend.html): `0.0%` @@ -215,7 +215,7 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[extend-namespace-01-f](SVGViewTests/w3c/1.1F2/svg/extend-namespace-01-f.svg)| +|❌|[extend-namespace-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/extend-namespace-01-f.svg)| ### [Filters](https://www.w3.org/TR/SVG11/filters.html): `0.0%` @@ -225,49 +225,49 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[filters-background-01-f](SVGViewTests/w3c/1.1F2/svg/filters-background-01-f.svg)| -|❌|[filters-blend-01-b](SVGViewTests/w3c/1.1F2/svg/filters-blend-01-b.svg)| -|❌|[filters-color-01-b](SVGViewTests/w3c/1.1F2/svg/filters-color-01-b.svg)| -|❌|[filters-color-02-b](SVGViewTests/w3c/1.1F2/svg/filters-color-02-b.svg)| -|❌|[filters-composite-02-b](SVGViewTests/w3c/1.1F2/svg/filters-composite-02-b.svg)| -|❌|[filters-composite-03-f](SVGViewTests/w3c/1.1F2/svg/filters-composite-03-f.svg)| -|❌|[filters-composite-04-f](SVGViewTests/w3c/1.1F2/svg/filters-composite-04-f.svg)| -|❌|[filters-composite-05-f](SVGViewTests/w3c/1.1F2/svg/filters-composite-05-f.svg)| -|❌|[filters-comptran-01-b](SVGViewTests/w3c/1.1F2/svg/filters-comptran-01-b.svg)| -|❌|[filters-conv-01-f](SVGViewTests/w3c/1.1F2/svg/filters-conv-01-f.svg)| -|❌|[filters-conv-02-f](SVGViewTests/w3c/1.1F2/svg/filters-conv-02-f.svg)| -|❌|[filters-conv-03-f](SVGViewTests/w3c/1.1F2/svg/filters-conv-03-f.svg)| -|❌|[filters-conv-04-f](SVGViewTests/w3c/1.1F2/svg/filters-conv-04-f.svg)| -|❌|[filters-conv-05-f](SVGViewTests/w3c/1.1F2/svg/filters-conv-05-f.svg)| -|❌|[filters-diffuse-01-f](SVGViewTests/w3c/1.1F2/svg/filters-diffuse-01-f.svg)| -|❌|[filters-displace-01-f](SVGViewTests/w3c/1.1F2/svg/filters-displace-01-f.svg)| -|❌|[filters-displace-02-f](SVGViewTests/w3c/1.1F2/svg/filters-displace-02-f.svg)| -|❌|[filters-example-01-b](SVGViewTests/w3c/1.1F2/svg/filters-example-01-b.svg)| -|❌|[filters-felem-01-b](SVGViewTests/w3c/1.1F2/svg/filters-felem-01-b.svg)| -|❌|[filters-felem-02-f](SVGViewTests/w3c/1.1F2/svg/filters-felem-02-f.svg)| -|❌|[filters-gauss-01-b](SVGViewTests/w3c/1.1F2/svg/filters-gauss-01-b.svg)| -|❌|[filters-gauss-02-f](SVGViewTests/w3c/1.1F2/svg/filters-gauss-02-f.svg)| -|❌|[filters-gauss-03-f](SVGViewTests/w3c/1.1F2/svg/filters-gauss-03-f.svg)| -|❌|[filters-image-01-b](SVGViewTests/w3c/1.1F2/svg/filters-image-01-b.svg)| -|❌|[filters-image-02-b](SVGViewTests/w3c/1.1F2/svg/filters-image-02-b.svg)| -|❌|[filters-image-03-f](SVGViewTests/w3c/1.1F2/svg/filters-image-03-f.svg)| -|❌|[filters-image-04-f](SVGViewTests/w3c/1.1F2/svg/filters-image-04-f.svg)| -|❌|[filters-image-05-f](SVGViewTests/w3c/1.1F2/svg/filters-image-05-f.svg)| -|❌|[filters-light-01-f](SVGViewTests/w3c/1.1F2/svg/filters-light-01-f.svg)| -|❌|[filters-light-02-f](SVGViewTests/w3c/1.1F2/svg/filters-light-02-f.svg)| -|❌|[filters-light-03-f](SVGViewTests/w3c/1.1F2/svg/filters-light-03-f.svg)| -|❌|[filters-light-04-f](SVGViewTests/w3c/1.1F2/svg/filters-light-04-f.svg)| -|❌|[filters-light-05-f](SVGViewTests/w3c/1.1F2/svg/filters-light-05-f.svg)| -|❌|[filters-morph-01-f](SVGViewTests/w3c/1.1F2/svg/filters-morph-01-f.svg)| -|❌|[filters-offset-01-b](SVGViewTests/w3c/1.1F2/svg/filters-offset-01-b.svg)| -|❌|[filters-offset-02-b](SVGViewTests/w3c/1.1F2/svg/filters-offset-02-b.svg)| -|❌|[filters-overview-01-b](SVGViewTests/w3c/1.1F2/svg/filters-overview-01-b.svg)| -|❌|[filters-overview-02-b](SVGViewTests/w3c/1.1F2/svg/filters-overview-02-b.svg)| -|❌|[filters-overview-03-b](SVGViewTests/w3c/1.1F2/svg/filters-overview-03-b.svg)| -|❌|[filters-specular-01-f](SVGViewTests/w3c/1.1F2/svg/filters-specular-01-f.svg)| -|❌|[filters-tile-01-b](SVGViewTests/w3c/1.1F2/svg/filters-tile-01-b.svg)| -|❌|[filters-turb-01-f](SVGViewTests/w3c/1.1F2/svg/filters-turb-01-f.svg)| -|❌|[filters-turb-02-f](SVGViewTests/w3c/1.1F2/svg/filters-turb-02-f.svg)| +|❌|[filters-background-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-background-01-f.svg)| +|❌|[filters-blend-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/filters-blend-01-b.svg)| +|❌|[filters-color-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/filters-color-01-b.svg)| +|❌|[filters-color-02-b](Tests/SVGViewTests/w3c/1.1F2/svg/filters-color-02-b.svg)| +|❌|[filters-composite-02-b](Tests/SVGViewTests/w3c/1.1F2/svg/filters-composite-02-b.svg)| +|❌|[filters-composite-03-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-composite-03-f.svg)| +|❌|[filters-composite-04-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-composite-04-f.svg)| +|❌|[filters-composite-05-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-composite-05-f.svg)| +|❌|[filters-comptran-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/filters-comptran-01-b.svg)| +|❌|[filters-conv-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-conv-01-f.svg)| +|❌|[filters-conv-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-conv-02-f.svg)| +|❌|[filters-conv-03-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-conv-03-f.svg)| +|❌|[filters-conv-04-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-conv-04-f.svg)| +|❌|[filters-conv-05-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-conv-05-f.svg)| +|❌|[filters-diffuse-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-diffuse-01-f.svg)| +|❌|[filters-displace-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-displace-01-f.svg)| +|❌|[filters-displace-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-displace-02-f.svg)| +|❌|[filters-example-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/filters-example-01-b.svg)| +|❌|[filters-felem-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/filters-felem-01-b.svg)| +|❌|[filters-felem-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-felem-02-f.svg)| +|❌|[filters-gauss-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/filters-gauss-01-b.svg)| +|❌|[filters-gauss-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-gauss-02-f.svg)| +|❌|[filters-gauss-03-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-gauss-03-f.svg)| +|❌|[filters-image-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/filters-image-01-b.svg)| +|❌|[filters-image-02-b](Tests/SVGViewTests/w3c/1.1F2/svg/filters-image-02-b.svg)| +|❌|[filters-image-03-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-image-03-f.svg)| +|❌|[filters-image-04-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-image-04-f.svg)| +|❌|[filters-image-05-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-image-05-f.svg)| +|❌|[filters-light-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-light-01-f.svg)| +|❌|[filters-light-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-light-02-f.svg)| +|❌|[filters-light-03-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-light-03-f.svg)| +|❌|[filters-light-04-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-light-04-f.svg)| +|❌|[filters-light-05-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-light-05-f.svg)| +|❌|[filters-morph-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-morph-01-f.svg)| +|❌|[filters-offset-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/filters-offset-01-b.svg)| +|❌|[filters-offset-02-b](Tests/SVGViewTests/w3c/1.1F2/svg/filters-offset-02-b.svg)| +|❌|[filters-overview-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/filters-overview-01-b.svg)| +|❌|[filters-overview-02-b](Tests/SVGViewTests/w3c/1.1F2/svg/filters-overview-02-b.svg)| +|❌|[filters-overview-03-b](Tests/SVGViewTests/w3c/1.1F2/svg/filters-overview-03-b.svg)| +|❌|[filters-specular-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-specular-01-f.svg)| +|❌|[filters-tile-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/filters-tile-01-b.svg)| +|❌|[filters-turb-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-turb-01-f.svg)| +|❌|[filters-turb-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/filters-turb-02-f.svg)| ### [Fonts](https://www.w3.org/TR/SVG11/fonts.html): `0.0%` @@ -277,23 +277,23 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[fonts-desc-01-t](SVGViewTests/w3c/1.1F2/svg/fonts-desc-01-t.svg)| -|❌|[fonts-desc-02-t](SVGViewTests/w3c/1.1F2/svg/fonts-desc-02-t.svg)| -|❌|[fonts-desc-03-t](SVGViewTests/w3c/1.1F2/svg/fonts-desc-03-t.svg)| -|❌|[fonts-desc-04-t](SVGViewTests/w3c/1.1F2/svg/fonts-desc-04-t.svg)| -|❌|[fonts-desc-05-t](SVGViewTests/w3c/1.1F2/svg/fonts-desc-05-t.svg)| -|❌|[fonts-elem-01-t](SVGViewTests/w3c/1.1F2/svg/fonts-elem-01-t.svg)| -|❌|[fonts-elem-02-t](SVGViewTests/w3c/1.1F2/svg/fonts-elem-02-t.svg)| -|❌|[fonts-elem-03-b](SVGViewTests/w3c/1.1F2/svg/fonts-elem-03-b.svg)| -|❌|[fonts-elem-04-b](SVGViewTests/w3c/1.1F2/svg/fonts-elem-04-b.svg)| -|❌|[fonts-elem-05-t](SVGViewTests/w3c/1.1F2/svg/fonts-elem-05-t.svg)| -|❌|[fonts-elem-06-t](SVGViewTests/w3c/1.1F2/svg/fonts-elem-06-t.svg)| -|❌|[fonts-elem-07-b](SVGViewTests/w3c/1.1F2/svg/fonts-elem-07-b.svg)| -|❌|[fonts-glyph-02-t](SVGViewTests/w3c/1.1F2/svg/fonts-glyph-02-t.svg)| -|❌|[fonts-glyph-03-t](SVGViewTests/w3c/1.1F2/svg/fonts-glyph-03-t.svg)| -|❌|[fonts-glyph-04-t](SVGViewTests/w3c/1.1F2/svg/fonts-glyph-04-t.svg)| -|❌|[fonts-kern-01-t](SVGViewTests/w3c/1.1F2/svg/fonts-kern-01-t.svg)| -|❌|[fonts-overview-201-t](SVGViewTests/w3c/1.1F2/svg/fonts-overview-201-t.svg)| +|❌|[fonts-desc-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/fonts-desc-01-t.svg)| +|❌|[fonts-desc-02-t](Tests/SVGViewTests/w3c/1.1F2/svg/fonts-desc-02-t.svg)| +|❌|[fonts-desc-03-t](Tests/SVGViewTests/w3c/1.1F2/svg/fonts-desc-03-t.svg)| +|❌|[fonts-desc-04-t](Tests/SVGViewTests/w3c/1.1F2/svg/fonts-desc-04-t.svg)| +|❌|[fonts-desc-05-t](Tests/SVGViewTests/w3c/1.1F2/svg/fonts-desc-05-t.svg)| +|❌|[fonts-elem-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/fonts-elem-01-t.svg)| +|❌|[fonts-elem-02-t](Tests/SVGViewTests/w3c/1.1F2/svg/fonts-elem-02-t.svg)| +|❌|[fonts-elem-03-b](Tests/SVGViewTests/w3c/1.1F2/svg/fonts-elem-03-b.svg)| +|❌|[fonts-elem-04-b](Tests/SVGViewTests/w3c/1.1F2/svg/fonts-elem-04-b.svg)| +|❌|[fonts-elem-05-t](Tests/SVGViewTests/w3c/1.1F2/svg/fonts-elem-05-t.svg)| +|❌|[fonts-elem-06-t](Tests/SVGViewTests/w3c/1.1F2/svg/fonts-elem-06-t.svg)| +|❌|[fonts-elem-07-b](Tests/SVGViewTests/w3c/1.1F2/svg/fonts-elem-07-b.svg)| +|❌|[fonts-glyph-02-t](Tests/SVGViewTests/w3c/1.1F2/svg/fonts-glyph-02-t.svg)| +|❌|[fonts-glyph-03-t](Tests/SVGViewTests/w3c/1.1F2/svg/fonts-glyph-03-t.svg)| +|❌|[fonts-glyph-04-t](Tests/SVGViewTests/w3c/1.1F2/svg/fonts-glyph-04-t.svg)| +|❌|[fonts-kern-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/fonts-kern-01-t.svg)| +|❌|[fonts-overview-201-t](Tests/SVGViewTests/w3c/1.1F2/svg/fonts-overview-201-t.svg)| ### [Imp](https://www.w3.org/TR/SVG11/imp.html): `0.0%` @@ -303,7 +303,7 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[imp-path-01-f](SVGViewTests/w3c/1.1F2/svg/imp-path-01-f.svg)| +|❌|[imp-path-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/imp-path-01-f.svg)| ### [Interact](https://www.w3.org/TR/SVG11/interact.html): `0.0%` @@ -313,30 +313,30 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[interact-cursor-01-f](SVGViewTests/w3c/1.1F2/svg/interact-cursor-01-f.svg)| -|❌|[interact-dom-01-b](SVGViewTests/w3c/1.1F2/svg/interact-dom-01-b.svg)| -|❌|[interact-events-01-b](SVGViewTests/w3c/1.1F2/svg/interact-events-01-b.svg)| -|❌|[interact-events-02-b](SVGViewTests/w3c/1.1F2/svg/interact-events-02-b.svg)| -|❌|[interact-events-202-f](SVGViewTests/w3c/1.1F2/svg/interact-events-202-f.svg)| -|❌|[interact-events-203-t](SVGViewTests/w3c/1.1F2/svg/interact-events-203-t.svg)| -|❌|[interact-order-01-b](SVGViewTests/w3c/1.1F2/svg/interact-order-01-b.svg)| -|❌|[interact-order-02-b](SVGViewTests/w3c/1.1F2/svg/interact-order-02-b.svg)| -|❌|[interact-order-03-b](SVGViewTests/w3c/1.1F2/svg/interact-order-03-b.svg)| -|❌|[interact-pevents-01-b](SVGViewTests/w3c/1.1F2/svg/interact-pevents-01-b.svg)| -|❌|[interact-pevents-03-b](SVGViewTests/w3c/1.1F2/svg/interact-pevents-03-b.svg)| -|❌|[interact-pevents-04-t](SVGViewTests/w3c/1.1F2/svg/interact-pevents-04-t.svg)| -|❌|[interact-pevents-05-b](SVGViewTests/w3c/1.1F2/svg/interact-pevents-05-b.svg)| -|❌|[interact-pevents-07-t](SVGViewTests/w3c/1.1F2/svg/interact-pevents-07-t.svg)| -|❌|[interact-pevents-08-f](SVGViewTests/w3c/1.1F2/svg/interact-pevents-08-f.svg)| -|❌|[interact-pevents-09-f](SVGViewTests/w3c/1.1F2/svg/interact-pevents-09-f.svg)| -|❌|[interact-pevents-10-f](SVGViewTests/w3c/1.1F2/svg/interact-pevents-10-f.svg)| -|❌|[interact-pointer-01-t](SVGViewTests/w3c/1.1F2/svg/interact-pointer-01-t.svg)| -|❌|[interact-pointer-02-t](SVGViewTests/w3c/1.1F2/svg/interact-pointer-02-t.svg)| -|❌|[interact-pointer-03-t](SVGViewTests/w3c/1.1F2/svg/interact-pointer-03-t.svg)| -|❌|[interact-pointer-04-f](SVGViewTests/w3c/1.1F2/svg/interact-pointer-04-f.svg)| -|❌|[interact-zoom-01-t](SVGViewTests/w3c/1.1F2/svg/interact-zoom-01-t.svg)| -|❌|[interact-zoom-02-t](SVGViewTests/w3c/1.1F2/svg/interact-zoom-02-t.svg)| -|❌|[interact-zoom-03-t](SVGViewTests/w3c/1.1F2/svg/interact-zoom-03-t.svg)| +|❌|[interact-cursor-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/interact-cursor-01-f.svg)| +|❌|[interact-dom-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/interact-dom-01-b.svg)| +|❌|[interact-events-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/interact-events-01-b.svg)| +|❌|[interact-events-02-b](Tests/SVGViewTests/w3c/1.1F2/svg/interact-events-02-b.svg)| +|❌|[interact-events-202-f](Tests/SVGViewTests/w3c/1.1F2/svg/interact-events-202-f.svg)| +|❌|[interact-events-203-t](Tests/SVGViewTests/w3c/1.1F2/svg/interact-events-203-t.svg)| +|❌|[interact-order-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/interact-order-01-b.svg)| +|❌|[interact-order-02-b](Tests/SVGViewTests/w3c/1.1F2/svg/interact-order-02-b.svg)| +|❌|[interact-order-03-b](Tests/SVGViewTests/w3c/1.1F2/svg/interact-order-03-b.svg)| +|❌|[interact-pevents-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/interact-pevents-01-b.svg)| +|❌|[interact-pevents-03-b](Tests/SVGViewTests/w3c/1.1F2/svg/interact-pevents-03-b.svg)| +|❌|[interact-pevents-04-t](Tests/SVGViewTests/w3c/1.1F2/svg/interact-pevents-04-t.svg)| +|❌|[interact-pevents-05-b](Tests/SVGViewTests/w3c/1.1F2/svg/interact-pevents-05-b.svg)| +|❌|[interact-pevents-07-t](Tests/SVGViewTests/w3c/1.1F2/svg/interact-pevents-07-t.svg)| +|❌|[interact-pevents-08-f](Tests/SVGViewTests/w3c/1.1F2/svg/interact-pevents-08-f.svg)| +|❌|[interact-pevents-09-f](Tests/SVGViewTests/w3c/1.1F2/svg/interact-pevents-09-f.svg)| +|❌|[interact-pevents-10-f](Tests/SVGViewTests/w3c/1.1F2/svg/interact-pevents-10-f.svg)| +|❌|[interact-pointer-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/interact-pointer-01-t.svg)| +|❌|[interact-pointer-02-t](Tests/SVGViewTests/w3c/1.1F2/svg/interact-pointer-02-t.svg)| +|❌|[interact-pointer-03-t](Tests/SVGViewTests/w3c/1.1F2/svg/interact-pointer-03-t.svg)| +|❌|[interact-pointer-04-f](Tests/SVGViewTests/w3c/1.1F2/svg/interact-pointer-04-f.svg)| +|❌|[interact-zoom-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/interact-zoom-01-t.svg)| +|❌|[interact-zoom-02-t](Tests/SVGViewTests/w3c/1.1F2/svg/interact-zoom-02-t.svg)| +|❌|[interact-zoom-03-t](Tests/SVGViewTests/w3c/1.1F2/svg/interact-zoom-03-t.svg)| ### [Linking](https://www.w3.org/TR/SVG11/linking.html): `0.0%` @@ -346,18 +346,18 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[linking-a-01-b](SVGViewTests/w3c/1.1F2/svg/linking-a-01-b.svg)| -|❌|[linking-a-03-b](SVGViewTests/w3c/1.1F2/svg/linking-a-03-b.svg)| -|❌|[linking-a-04-t](SVGViewTests/w3c/1.1F2/svg/linking-a-04-t.svg)| -|❌|[linking-a-05-t](SVGViewTests/w3c/1.1F2/svg/linking-a-05-t.svg)| -|❌|[linking-a-07-t](SVGViewTests/w3c/1.1F2/svg/linking-a-07-t.svg)| -|❌|[linking-a-08-t](SVGViewTests/w3c/1.1F2/svg/linking-a-08-t.svg)| -|❌|[linking-a-09-b](SVGViewTests/w3c/1.1F2/svg/linking-a-09-b.svg)| -|❌|[linking-a-10-f](SVGViewTests/w3c/1.1F2/svg/linking-a-10-f.svg)| -|❌|[linking-frag-01-f](SVGViewTests/w3c/1.1F2/svg/linking-frag-01-f.svg)| -|❌|[linking-uri-01-b](SVGViewTests/w3c/1.1F2/svg/linking-uri-01-b.svg)| -|❌|[linking-uri-02-b](SVGViewTests/w3c/1.1F2/svg/linking-uri-02-b.svg)| -|❌|[linking-uri-03-t](SVGViewTests/w3c/1.1F2/svg/linking-uri-03-t.svg)| +|❌|[linking-a-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/linking-a-01-b.svg)| +|❌|[linking-a-03-b](Tests/SVGViewTests/w3c/1.1F2/svg/linking-a-03-b.svg)| +|❌|[linking-a-04-t](Tests/SVGViewTests/w3c/1.1F2/svg/linking-a-04-t.svg)| +|❌|[linking-a-05-t](Tests/SVGViewTests/w3c/1.1F2/svg/linking-a-05-t.svg)| +|❌|[linking-a-07-t](Tests/SVGViewTests/w3c/1.1F2/svg/linking-a-07-t.svg)| +|❌|[linking-a-08-t](Tests/SVGViewTests/w3c/1.1F2/svg/linking-a-08-t.svg)| +|❌|[linking-a-09-b](Tests/SVGViewTests/w3c/1.1F2/svg/linking-a-09-b.svg)| +|❌|[linking-a-10-f](Tests/SVGViewTests/w3c/1.1F2/svg/linking-a-10-f.svg)| +|❌|[linking-frag-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/linking-frag-01-f.svg)| +|❌|[linking-uri-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/linking-uri-01-b.svg)| +|❌|[linking-uri-02-b](Tests/SVGViewTests/w3c/1.1F2/svg/linking-uri-02-b.svg)| +|❌|[linking-uri-03-t](Tests/SVGViewTests/w3c/1.1F2/svg/linking-uri-03-t.svg)| ### [Masking](https://www.w3.org/TR/SVG11/masking.html): `5.2%` @@ -367,25 +367,25 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[masking-filter-01-f](SVGViewTests/w3c/1.1F2/svg/masking-filter-01-f.svg)| -|❌|[masking-intro-01-f](SVGViewTests/w3c/1.1F2/svg/masking-intro-01-f.svg)| -|❌|[masking-mask-01-b](SVGViewTests/w3c/1.1F2/svg/masking-mask-01-b.svg)| -|❌|[masking-mask-02-f](SVGViewTests/w3c/1.1F2/svg/masking-mask-02-f.svg)| -|✅|[masking-opacity-01-b](SVGViewTests/w3c/1.1F2/svg/masking-opacity-01-b.svg)| -|❌|[masking-path-01-b](SVGViewTests/w3c/1.1F2/svg/masking-path-01-b.svg)| -|❌|[masking-path-02-b](SVGViewTests/w3c/1.1F2/svg/masking-path-02-b.svg)| -|❌|[masking-path-03-b](SVGViewTests/w3c/1.1F2/svg/masking-path-03-b.svg)| -|❌|[masking-path-04-b](SVGViewTests/w3c/1.1F2/svg/masking-path-04-b.svg)| -|❌|[masking-path-05-f](SVGViewTests/w3c/1.1F2/svg/masking-path-05-f.svg)| -|❌|[masking-path-06-b](SVGViewTests/w3c/1.1F2/svg/masking-path-06-b.svg)| -|❌|[masking-path-07-b](SVGViewTests/w3c/1.1F2/svg/masking-path-07-b.svg)| -|❌|[masking-path-08-b](SVGViewTests/w3c/1.1F2/svg/masking-path-08-b.svg)| -|❌|[masking-path-09-b](SVGViewTests/w3c/1.1F2/svg/masking-path-09-b.svg)| -|❌|[masking-path-10-b](SVGViewTests/w3c/1.1F2/svg/masking-path-10-b.svg)| -|❌|[masking-path-11-b](SVGViewTests/w3c/1.1F2/svg/masking-path-11-b.svg)| -|❌|[masking-path-12-f](SVGViewTests/w3c/1.1F2/svg/masking-path-12-f.svg)| -|❌|[masking-path-13-f](SVGViewTests/w3c/1.1F2/svg/masking-path-13-f.svg)| -|❌|[masking-path-14-f](SVGViewTests/w3c/1.1F2/svg/masking-path-14-f.svg)| +|❌|[masking-filter-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/masking-filter-01-f.svg)| +|❌|[masking-intro-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/masking-intro-01-f.svg)| +|❌|[masking-mask-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/masking-mask-01-b.svg)| +|❌|[masking-mask-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/masking-mask-02-f.svg)| +|✅|[masking-opacity-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/masking-opacity-01-b.svg)| +|❌|[masking-path-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/masking-path-01-b.svg)| +|❌|[masking-path-02-b](Tests/SVGViewTests/w3c/1.1F2/svg/masking-path-02-b.svg)| +|❌|[masking-path-03-b](Tests/SVGViewTests/w3c/1.1F2/svg/masking-path-03-b.svg)| +|❌|[masking-path-04-b](Tests/SVGViewTests/w3c/1.1F2/svg/masking-path-04-b.svg)| +|❌|[masking-path-05-f](Tests/SVGViewTests/w3c/1.1F2/svg/masking-path-05-f.svg)| +|❌|[masking-path-06-b](Tests/SVGViewTests/w3c/1.1F2/svg/masking-path-06-b.svg)| +|❌|[masking-path-07-b](Tests/SVGViewTests/w3c/1.1F2/svg/masking-path-07-b.svg)| +|❌|[masking-path-08-b](Tests/SVGViewTests/w3c/1.1F2/svg/masking-path-08-b.svg)| +|❌|[masking-path-09-b](Tests/SVGViewTests/w3c/1.1F2/svg/masking-path-09-b.svg)| +|❌|[masking-path-10-b](Tests/SVGViewTests/w3c/1.1F2/svg/masking-path-10-b.svg)| +|❌|[masking-path-11-b](Tests/SVGViewTests/w3c/1.1F2/svg/masking-path-11-b.svg)| +|❌|[masking-path-12-f](Tests/SVGViewTests/w3c/1.1F2/svg/masking-path-12-f.svg)| +|❌|[masking-path-13-f](Tests/SVGViewTests/w3c/1.1F2/svg/masking-path-13-f.svg)| +|❌|[masking-path-14-f](Tests/SVGViewTests/w3c/1.1F2/svg/masking-path-14-f.svg)| ### [Metadata](https://www.w3.org/TR/SVG11/metadata.html): `0.0%` @@ -395,7 +395,7 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[metadata-example-01-t](SVGViewTests/w3c/1.1F2/svg/metadata-example-01-t.svg)| +|❌|[metadata-example-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/metadata-example-01-t.svg)| ### [Painting](https://www.w3.org/TR/SVG11/painting.html): `51.6%` @@ -405,37 +405,37 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[painting-control-01-f](SVGViewTests/w3c/1.1F2/svg/painting-control-01-f.svg)| -|✅|[painting-control-02-f](SVGViewTests/w3c/1.1F2/svg/painting-control-02-f.svg)| -|✅|[painting-control-03-f](SVGViewTests/w3c/1.1F2/svg/painting-control-03-f.svg)| -|❌|[painting-control-04-f](SVGViewTests/w3c/1.1F2/svg/painting-control-04-f.svg)| -|❌|[painting-control-05-f](SVGViewTests/w3c/1.1F2/svg/painting-control-05-f.svg)| -|❌|[painting-control-06-f](SVGViewTests/w3c/1.1F2/svg/painting-control-06-f.svg)| -|✅|[painting-fill-01-t](SVGViewTests/w3c/1.1F2/svg/painting-fill-01-t.svg)| -|✅|[painting-fill-02-t](SVGViewTests/w3c/1.1F2/svg/painting-fill-02-t.svg)| -|✅|[painting-fill-03-t](SVGViewTests/w3c/1.1F2/svg/painting-fill-03-t.svg)| -|✅|[painting-fill-04-t](SVGViewTests/w3c/1.1F2/svg/painting-fill-04-t.svg)| -|✅|[painting-fill-05-b](SVGViewTests/w3c/1.1F2/svg/painting-fill-05-b.svg)| -|✅|[painting-marker-01-f](SVGViewTests/w3c/1.1F2/svg/painting-marker-01-f.svg)| -|❌|[painting-marker-02-f](SVGViewTests/w3c/1.1F2/svg/painting-marker-02-f.svg)| -|❌|[painting-marker-03-f](SVGViewTests/w3c/1.1F2/svg/painting-marker-03-f.svg)| -|❌|[painting-marker-04-f](SVGViewTests/w3c/1.1F2/svg/painting-marker-04-f.svg)| -|❌|[painting-marker-05-f](SVGViewTests/w3c/1.1F2/svg/painting-marker-05-f.svg)| -|❌|[painting-marker-06-f](SVGViewTests/w3c/1.1F2/svg/painting-marker-06-f.svg)| -|❌|[painting-marker-07-f](SVGViewTests/w3c/1.1F2/svg/painting-marker-07-f.svg)| -|❌|[painting-marker-properties-01-f](SVGViewTests/w3c/1.1F2/svg/painting-marker-properties-01-f.svg)| -|❌|[painting-render-01-b](SVGViewTests/w3c/1.1F2/svg/painting-render-01-b.svg)| -|❌|[painting-render-02-b](SVGViewTests/w3c/1.1F2/svg/painting-render-02-b.svg)| -|✅|[painting-stroke-01-t](SVGViewTests/w3c/1.1F2/svg/painting-stroke-01-t.svg)| -|✅|[painting-stroke-02-t](SVGViewTests/w3c/1.1F2/svg/painting-stroke-02-t.svg)| -|✅|[painting-stroke-03-t](SVGViewTests/w3c/1.1F2/svg/painting-stroke-03-t.svg)| -|✅|[painting-stroke-04-t](SVGViewTests/w3c/1.1F2/svg/painting-stroke-04-t.svg)| -|✅|[painting-stroke-05-t](SVGViewTests/w3c/1.1F2/svg/painting-stroke-05-t.svg)| -|❌|[painting-stroke-06-t](SVGViewTests/w3c/1.1F2/svg/painting-stroke-06-t.svg)| -|✅|[painting-stroke-07-t](SVGViewTests/w3c/1.1F2/svg/painting-stroke-07-t.svg)| -|✅|[painting-stroke-08-t](SVGViewTests/w3c/1.1F2/svg/painting-stroke-08-t.svg)| -|✅|[painting-stroke-09-t](SVGViewTests/w3c/1.1F2/svg/painting-stroke-09-t.svg)| -|❌|[painting-stroke-10-t](SVGViewTests/w3c/1.1F2/svg/painting-stroke-10-t.svg)| +|❌|[painting-control-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/painting-control-01-f.svg)| +|✅|[painting-control-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/painting-control-02-f.svg)| +|✅|[painting-control-03-f](Tests/SVGViewTests/w3c/1.1F2/svg/painting-control-03-f.svg)| +|❌|[painting-control-04-f](Tests/SVGViewTests/w3c/1.1F2/svg/painting-control-04-f.svg)| +|❌|[painting-control-05-f](Tests/SVGViewTests/w3c/1.1F2/svg/painting-control-05-f.svg)| +|❌|[painting-control-06-f](Tests/SVGViewTests/w3c/1.1F2/svg/painting-control-06-f.svg)| +|✅|[painting-fill-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/painting-fill-01-t.svg)| +|✅|[painting-fill-02-t](Tests/SVGViewTests/w3c/1.1F2/svg/painting-fill-02-t.svg)| +|✅|[painting-fill-03-t](Tests/SVGViewTests/w3c/1.1F2/svg/painting-fill-03-t.svg)| +|✅|[painting-fill-04-t](Tests/SVGViewTests/w3c/1.1F2/svg/painting-fill-04-t.svg)| +|✅|[painting-fill-05-b](Tests/SVGViewTests/w3c/1.1F2/svg/painting-fill-05-b.svg)| +|✅|[painting-marker-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/painting-marker-01-f.svg)| +|❌|[painting-marker-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/painting-marker-02-f.svg)| +|❌|[painting-marker-03-f](Tests/SVGViewTests/w3c/1.1F2/svg/painting-marker-03-f.svg)| +|❌|[painting-marker-04-f](Tests/SVGViewTests/w3c/1.1F2/svg/painting-marker-04-f.svg)| +|❌|[painting-marker-05-f](Tests/SVGViewTests/w3c/1.1F2/svg/painting-marker-05-f.svg)| +|❌|[painting-marker-06-f](Tests/SVGViewTests/w3c/1.1F2/svg/painting-marker-06-f.svg)| +|❌|[painting-marker-07-f](Tests/SVGViewTests/w3c/1.1F2/svg/painting-marker-07-f.svg)| +|❌|[painting-marker-properties-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/painting-marker-properties-01-f.svg)| +|❌|[painting-render-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/painting-render-01-b.svg)| +|❌|[painting-render-02-b](Tests/SVGViewTests/w3c/1.1F2/svg/painting-render-02-b.svg)| +|✅|[painting-stroke-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/painting-stroke-01-t.svg)| +|✅|[painting-stroke-02-t](Tests/SVGViewTests/w3c/1.1F2/svg/painting-stroke-02-t.svg)| +|✅|[painting-stroke-03-t](Tests/SVGViewTests/w3c/1.1F2/svg/painting-stroke-03-t.svg)| +|✅|[painting-stroke-04-t](Tests/SVGViewTests/w3c/1.1F2/svg/painting-stroke-04-t.svg)| +|✅|[painting-stroke-05-t](Tests/SVGViewTests/w3c/1.1F2/svg/painting-stroke-05-t.svg)| +|❌|[painting-stroke-06-t](Tests/SVGViewTests/w3c/1.1F2/svg/painting-stroke-06-t.svg)| +|✅|[painting-stroke-07-t](Tests/SVGViewTests/w3c/1.1F2/svg/painting-stroke-07-t.svg)| +|✅|[painting-stroke-08-t](Tests/SVGViewTests/w3c/1.1F2/svg/painting-stroke-08-t.svg)| +|✅|[painting-stroke-09-t](Tests/SVGViewTests/w3c/1.1F2/svg/painting-stroke-09-t.svg)| +|❌|[painting-stroke-10-t](Tests/SVGViewTests/w3c/1.1F2/svg/painting-stroke-10-t.svg)| ### [Paths](https://www.w3.org/TR/SVG11/paths.html): `90.4%` @@ -445,27 +445,27 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|✅|[paths-data-01-t](SVGViewTests/w3c/1.1F2/svg/paths-data-01-t.svg)| -|✅|[paths-data-02-t](SVGViewTests/w3c/1.1F2/svg/paths-data-02-t.svg)| -|✅|[paths-data-03-f](SVGViewTests/w3c/1.1F2/svg/paths-data-03-f.svg)| -|✅|[paths-data-04-t](SVGViewTests/w3c/1.1F2/svg/paths-data-04-t.svg)| -|✅|[paths-data-05-t](SVGViewTests/w3c/1.1F2/svg/paths-data-05-t.svg)| -|✅|[paths-data-06-t](SVGViewTests/w3c/1.1F2/svg/paths-data-06-t.svg)| -|✅|[paths-data-07-t](SVGViewTests/w3c/1.1F2/svg/paths-data-07-t.svg)| -|✅|[paths-data-08-t](SVGViewTests/w3c/1.1F2/svg/paths-data-08-t.svg)| -|✅|[paths-data-09-t](SVGViewTests/w3c/1.1F2/svg/paths-data-09-t.svg)| -|✅|[paths-data-10-t](SVGViewTests/w3c/1.1F2/svg/paths-data-10-t.svg)| -|✅|[paths-data-12-t](SVGViewTests/w3c/1.1F2/svg/paths-data-12-t.svg)| -|✅|[paths-data-13-t](SVGViewTests/w3c/1.1F2/svg/paths-data-13-t.svg)| -|✅|[paths-data-14-t](SVGViewTests/w3c/1.1F2/svg/paths-data-14-t.svg)| -|✅|[paths-data-15-t](SVGViewTests/w3c/1.1F2/svg/paths-data-15-t.svg)| -|✅|[paths-data-16-t](SVGViewTests/w3c/1.1F2/svg/paths-data-16-t.svg)| -|✅|[paths-data-17-f](SVGViewTests/w3c/1.1F2/svg/paths-data-17-f.svg)| -|✅|[paths-data-18-f](SVGViewTests/w3c/1.1F2/svg/paths-data-18-f.svg)| -|✅|[paths-data-19-f](SVGViewTests/w3c/1.1F2/svg/paths-data-19-f.svg)| -|✅|[paths-data-20-f](SVGViewTests/w3c/1.1F2/svg/paths-data-20-f.svg)| -|❌|[paths-dom-01-f](SVGViewTests/w3c/1.1F2/svg/paths-dom-01-f.svg)| -|❌|[paths-dom-02-f](SVGViewTests/w3c/1.1F2/svg/paths-dom-02-f.svg)| +|✅|[paths-data-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/paths-data-01-t.svg)| +|✅|[paths-data-02-t](Tests/SVGViewTests/w3c/1.1F2/svg/paths-data-02-t.svg)| +|✅|[paths-data-03-f](Tests/SVGViewTests/w3c/1.1F2/svg/paths-data-03-f.svg)| +|✅|[paths-data-04-t](Tests/SVGViewTests/w3c/1.1F2/svg/paths-data-04-t.svg)| +|✅|[paths-data-05-t](Tests/SVGViewTests/w3c/1.1F2/svg/paths-data-05-t.svg)| +|✅|[paths-data-06-t](Tests/SVGViewTests/w3c/1.1F2/svg/paths-data-06-t.svg)| +|✅|[paths-data-07-t](Tests/SVGViewTests/w3c/1.1F2/svg/paths-data-07-t.svg)| +|✅|[paths-data-08-t](Tests/SVGViewTests/w3c/1.1F2/svg/paths-data-08-t.svg)| +|✅|[paths-data-09-t](Tests/SVGViewTests/w3c/1.1F2/svg/paths-data-09-t.svg)| +|✅|[paths-data-10-t](Tests/SVGViewTests/w3c/1.1F2/svg/paths-data-10-t.svg)| +|✅|[paths-data-12-t](Tests/SVGViewTests/w3c/1.1F2/svg/paths-data-12-t.svg)| +|✅|[paths-data-13-t](Tests/SVGViewTests/w3c/1.1F2/svg/paths-data-13-t.svg)| +|✅|[paths-data-14-t](Tests/SVGViewTests/w3c/1.1F2/svg/paths-data-14-t.svg)| +|✅|[paths-data-15-t](Tests/SVGViewTests/w3c/1.1F2/svg/paths-data-15-t.svg)| +|✅|[paths-data-16-t](Tests/SVGViewTests/w3c/1.1F2/svg/paths-data-16-t.svg)| +|✅|[paths-data-17-f](Tests/SVGViewTests/w3c/1.1F2/svg/paths-data-17-f.svg)| +|✅|[paths-data-18-f](Tests/SVGViewTests/w3c/1.1F2/svg/paths-data-18-f.svg)| +|✅|[paths-data-19-f](Tests/SVGViewTests/w3c/1.1F2/svg/paths-data-19-f.svg)| +|✅|[paths-data-20-f](Tests/SVGViewTests/w3c/1.1F2/svg/paths-data-20-f.svg)| +|❌|[paths-dom-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/paths-dom-01-f.svg)| +|❌|[paths-dom-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/paths-dom-02-f.svg)| ### [Pservers](https://www.w3.org/TR/SVG11/pservers.html): `18.1%` @@ -475,39 +475,39 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|✅|[pservers-grad-01-b](SVGViewTests/w3c/1.1F2/svg/pservers-grad-01-b.svg)| -|✅|[pservers-grad-02-b](SVGViewTests/w3c/1.1F2/svg/pservers-grad-02-b.svg)| -|❌|[pservers-grad-03-b](SVGViewTests/w3c/1.1F2/svg/pservers-grad-03-b.svg)| -|✅|[pservers-grad-04-b](SVGViewTests/w3c/1.1F2/svg/pservers-grad-04-b.svg)| -|✅|[pservers-grad-05-b](SVGViewTests/w3c/1.1F2/svg/pservers-grad-05-b.svg)| -|❌|[pservers-grad-06-b](SVGViewTests/w3c/1.1F2/svg/pservers-grad-06-b.svg)| -|✅|[pservers-grad-07-b](SVGViewTests/w3c/1.1F2/svg/pservers-grad-07-b.svg)| -|❌|[pservers-grad-08-b](SVGViewTests/w3c/1.1F2/svg/pservers-grad-08-b.svg)| -|✅|[pservers-grad-09-b](SVGViewTests/w3c/1.1F2/svg/pservers-grad-09-b.svg)| -|❌|[pservers-grad-10-b](SVGViewTests/w3c/1.1F2/svg/pservers-grad-10-b.svg)| -|❌|[pservers-grad-11-b](SVGViewTests/w3c/1.1F2/svg/pservers-grad-11-b.svg)| -|❌|[pservers-grad-12-b](SVGViewTests/w3c/1.1F2/svg/pservers-grad-12-b.svg)| -|❌|[pservers-grad-13-b](SVGViewTests/w3c/1.1F2/svg/pservers-grad-13-b.svg)| -|❌|[pservers-grad-14-b](SVGViewTests/w3c/1.1F2/svg/pservers-grad-14-b.svg)| -|❌|[pservers-grad-15-b](SVGViewTests/w3c/1.1F2/svg/pservers-grad-15-b.svg)| -|❌|[pservers-grad-16-b](SVGViewTests/w3c/1.1F2/svg/pservers-grad-16-b.svg)| -|❌|[pservers-grad-17-b](SVGViewTests/w3c/1.1F2/svg/pservers-grad-17-b.svg)| -|❌|[pservers-grad-18-b](SVGViewTests/w3c/1.1F2/svg/pservers-grad-18-b.svg)| -|❌|[pservers-grad-20-b](SVGViewTests/w3c/1.1F2/svg/pservers-grad-20-b.svg)| -|❌|[pservers-grad-21-b](SVGViewTests/w3c/1.1F2/svg/pservers-grad-21-b.svg)| -|❌|[pservers-grad-22-b](SVGViewTests/w3c/1.1F2/svg/pservers-grad-22-b.svg)| -|❌|[pservers-grad-23-f](SVGViewTests/w3c/1.1F2/svg/pservers-grad-23-f.svg)| -|❌|[pservers-grad-24-f](SVGViewTests/w3c/1.1F2/svg/pservers-grad-24-f.svg)| -|❌|[pservers-grad-stops-01-f](SVGViewTests/w3c/1.1F2/svg/pservers-grad-stops-01-f.svg)| -|❌|[pservers-pattern-01-b](SVGViewTests/w3c/1.1F2/svg/pservers-pattern-01-b.svg)| -|❌|[pservers-pattern-02-f](SVGViewTests/w3c/1.1F2/svg/pservers-pattern-02-f.svg)| -|❌|[pservers-pattern-03-f](SVGViewTests/w3c/1.1F2/svg/pservers-pattern-03-f.svg)| -|❌|[pservers-pattern-04-f](SVGViewTests/w3c/1.1F2/svg/pservers-pattern-04-f.svg)| -|❌|[pservers-pattern-05-f](SVGViewTests/w3c/1.1F2/svg/pservers-pattern-05-f.svg)| -|❌|[pservers-pattern-06-f](SVGViewTests/w3c/1.1F2/svg/pservers-pattern-06-f.svg)| -|❌|[pservers-pattern-07-f](SVGViewTests/w3c/1.1F2/svg/pservers-pattern-07-f.svg)| -|❌|[pservers-pattern-08-f](SVGViewTests/w3c/1.1F2/svg/pservers-pattern-08-f.svg)| -|❌|[pservers-pattern-09-f](SVGViewTests/w3c/1.1F2/svg/pservers-pattern-09-f.svg)| +|✅|[pservers-grad-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-01-b.svg)| +|✅|[pservers-grad-02-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-02-b.svg)| +|❌|[pservers-grad-03-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-03-b.svg)| +|✅|[pservers-grad-04-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-04-b.svg)| +|✅|[pservers-grad-05-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-05-b.svg)| +|❌|[pservers-grad-06-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-06-b.svg)| +|✅|[pservers-grad-07-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-07-b.svg)| +|❌|[pservers-grad-08-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-08-b.svg)| +|✅|[pservers-grad-09-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-09-b.svg)| +|❌|[pservers-grad-10-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-10-b.svg)| +|❌|[pservers-grad-11-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-11-b.svg)| +|❌|[pservers-grad-12-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-12-b.svg)| +|❌|[pservers-grad-13-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-13-b.svg)| +|❌|[pservers-grad-14-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-14-b.svg)| +|❌|[pservers-grad-15-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-15-b.svg)| +|❌|[pservers-grad-16-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-16-b.svg)| +|❌|[pservers-grad-17-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-17-b.svg)| +|❌|[pservers-grad-18-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-18-b.svg)| +|❌|[pservers-grad-20-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-20-b.svg)| +|❌|[pservers-grad-21-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-21-b.svg)| +|❌|[pservers-grad-22-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-22-b.svg)| +|❌|[pservers-grad-23-f](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-23-f.svg)| +|❌|[pservers-grad-24-f](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-24-f.svg)| +|❌|[pservers-grad-stops-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-stops-01-f.svg)| +|❌|[pservers-pattern-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-pattern-01-b.svg)| +|❌|[pservers-pattern-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-pattern-02-f.svg)| +|❌|[pservers-pattern-03-f](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-pattern-03-f.svg)| +|❌|[pservers-pattern-04-f](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-pattern-04-f.svg)| +|❌|[pservers-pattern-05-f](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-pattern-05-f.svg)| +|❌|[pservers-pattern-06-f](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-pattern-06-f.svg)| +|❌|[pservers-pattern-07-f](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-pattern-07-f.svg)| +|❌|[pservers-pattern-08-f](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-pattern-08-f.svg)| +|❌|[pservers-pattern-09-f](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-pattern-09-f.svg)| ### [Render](https://www.w3.org/TR/SVG11/render.html): `37.5%` @@ -517,14 +517,14 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|✅|[render-elems-01-t](SVGViewTests/w3c/1.1F2/svg/render-elems-01-t.svg)| -|✅|[render-elems-02-t](SVGViewTests/w3c/1.1F2/svg/render-elems-02-t.svg)| -|✅|[render-elems-03-t](SVGViewTests/w3c/1.1F2/svg/render-elems-03-t.svg)| -|❌|[render-elems-06-t](SVGViewTests/w3c/1.1F2/svg/render-elems-06-t.svg)| -|❌|[render-elems-07-t](SVGViewTests/w3c/1.1F2/svg/render-elems-07-t.svg)| -|❌|[render-elems-08-t](SVGViewTests/w3c/1.1F2/svg/render-elems-08-t.svg)| -|❌|[render-groups-01-b](SVGViewTests/w3c/1.1F2/svg/render-groups-01-b.svg)| -|❌|[render-groups-03-t](SVGViewTests/w3c/1.1F2/svg/render-groups-03-t.svg)| +|✅|[render-elems-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/render-elems-01-t.svg)| +|✅|[render-elems-02-t](Tests/SVGViewTests/w3c/1.1F2/svg/render-elems-02-t.svg)| +|✅|[render-elems-03-t](Tests/SVGViewTests/w3c/1.1F2/svg/render-elems-03-t.svg)| +|❌|[render-elems-06-t](Tests/SVGViewTests/w3c/1.1F2/svg/render-elems-06-t.svg)| +|❌|[render-elems-07-t](Tests/SVGViewTests/w3c/1.1F2/svg/render-elems-07-t.svg)| +|❌|[render-elems-08-t](Tests/SVGViewTests/w3c/1.1F2/svg/render-elems-08-t.svg)| +|❌|[render-groups-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/render-groups-01-b.svg)| +|❌|[render-groups-03-t](Tests/SVGViewTests/w3c/1.1F2/svg/render-groups-03-t.svg)| ### [Script](https://www.w3.org/TR/SVG11/script.html): `0.0%` @@ -534,12 +534,12 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[script-handle-01-b](SVGViewTests/w3c/1.1F2/svg/script-handle-01-b.svg)| -|❌|[script-handle-02-b](SVGViewTests/w3c/1.1F2/svg/script-handle-02-b.svg)| -|❌|[script-handle-03-b](SVGViewTests/w3c/1.1F2/svg/script-handle-03-b.svg)| -|❌|[script-handle-04-b](SVGViewTests/w3c/1.1F2/svg/script-handle-04-b.svg)| -|❌|[script-specify-01-f](SVGViewTests/w3c/1.1F2/svg/script-specify-01-f.svg)| -|❌|[script-specify-02-f](SVGViewTests/w3c/1.1F2/svg/script-specify-02-f.svg)| +|❌|[script-handle-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/script-handle-01-b.svg)| +|❌|[script-handle-02-b](Tests/SVGViewTests/w3c/1.1F2/svg/script-handle-02-b.svg)| +|❌|[script-handle-03-b](Tests/SVGViewTests/w3c/1.1F2/svg/script-handle-03-b.svg)| +|❌|[script-handle-04-b](Tests/SVGViewTests/w3c/1.1F2/svg/script-handle-04-b.svg)| +|❌|[script-specify-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/script-specify-01-f.svg)| +|❌|[script-specify-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/script-specify-02-f.svg)| ### [Shapes](https://www.w3.org/TR/SVG11/shapes.html): `81.8%` @@ -549,109 +549,109 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|✅|[shapes-circle-01-t](SVGViewTests/w3c/1.1F2/svg/shapes-circle-01-t.svg)| -|✅|[shapes-circle-02-t](SVGViewTests/w3c/1.1F2/svg/shapes-circle-02-t.svg)| -|✅|[shapes-ellipse-01-t](SVGViewTests/w3c/1.1F2/svg/shapes-ellipse-01-t.svg)| -|✅|[shapes-ellipse-02-t](SVGViewTests/w3c/1.1F2/svg/shapes-ellipse-02-t.svg)| -|✅|[shapes-ellipse-03-f](SVGViewTests/w3c/1.1F2/svg/shapes-ellipse-03-f.svg)| -|✅|[shapes-grammar-01-f](SVGViewTests/w3c/1.1F2/svg/shapes-grammar-01-f.svg)| -|✅|[shapes-intro-01-t](SVGViewTests/w3c/1.1F2/svg/shapes-intro-01-t.svg)| -|❌|[shapes-intro-02-f](SVGViewTests/w3c/1.1F2/svg/shapes-intro-02-f.svg)| -|✅|[shapes-line-01-t](SVGViewTests/w3c/1.1F2/svg/shapes-line-01-t.svg)| -|✅|[shapes-line-02-f](SVGViewTests/w3c/1.1F2/svg/shapes-line-02-f.svg)| -|✅|[shapes-polygon-01-t](SVGViewTests/w3c/1.1F2/svg/shapes-polygon-01-t.svg)| -|✅|[shapes-polygon-02-t](SVGViewTests/w3c/1.1F2/svg/shapes-polygon-02-t.svg)| -|✅|[shapes-polygon-03-t](SVGViewTests/w3c/1.1F2/svg/shapes-polygon-03-t.svg)| -|✅|[shapes-polyline-01-t](SVGViewTests/w3c/1.1F2/svg/shapes-polyline-01-t.svg)| -|✅|[shapes-polyline-02-t](SVGViewTests/w3c/1.1F2/svg/shapes-polyline-02-t.svg)| -|❌|[shapes-rect-01-t](SVGViewTests/w3c/1.1F2/svg/shapes-rect-01-t.svg)| -|✅|[shapes-rect-02-t](SVGViewTests/w3c/1.1F2/svg/shapes-rect-02-t.svg)| -|❌|[shapes-rect-03-t](SVGViewTests/w3c/1.1F2/svg/shapes-rect-03-t.svg)| -|✅|[shapes-rect-04-f](SVGViewTests/w3c/1.1F2/svg/shapes-rect-04-f.svg)| -|✅|[shapes-rect-05-f](SVGViewTests/w3c/1.1F2/svg/shapes-rect-05-f.svg)| -|✅|[shapes-rect-06-f](SVGViewTests/w3c/1.1F2/svg/shapes-rect-06-f.svg)| -|❌|[shapes-rect-07-f](SVGViewTests/w3c/1.1F2/svg/shapes-rect-07-f.svg)| +|✅|[shapes-circle-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/shapes-circle-01-t.svg)| +|✅|[shapes-circle-02-t](Tests/SVGViewTests/w3c/1.1F2/svg/shapes-circle-02-t.svg)| +|✅|[shapes-ellipse-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/shapes-ellipse-01-t.svg)| +|✅|[shapes-ellipse-02-t](Tests/SVGViewTests/w3c/1.1F2/svg/shapes-ellipse-02-t.svg)| +|✅|[shapes-ellipse-03-f](Tests/SVGViewTests/w3c/1.1F2/svg/shapes-ellipse-03-f.svg)| +|✅|[shapes-grammar-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/shapes-grammar-01-f.svg)| +|✅|[shapes-intro-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/shapes-intro-01-t.svg)| +|❌|[shapes-intro-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/shapes-intro-02-f.svg)| +|✅|[shapes-line-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/shapes-line-01-t.svg)| +|✅|[shapes-line-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/shapes-line-02-f.svg)| +|✅|[shapes-polygon-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/shapes-polygon-01-t.svg)| +|✅|[shapes-polygon-02-t](Tests/SVGViewTests/w3c/1.1F2/svg/shapes-polygon-02-t.svg)| +|✅|[shapes-polygon-03-t](Tests/SVGViewTests/w3c/1.1F2/svg/shapes-polygon-03-t.svg)| +|✅|[shapes-polyline-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/shapes-polyline-01-t.svg)| +|✅|[shapes-polyline-02-t](Tests/SVGViewTests/w3c/1.1F2/svg/shapes-polyline-02-t.svg)| +|❌|[shapes-rect-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/shapes-rect-01-t.svg)| +|✅|[shapes-rect-02-t](Tests/SVGViewTests/w3c/1.1F2/svg/shapes-rect-02-t.svg)| +|❌|[shapes-rect-03-t](Tests/SVGViewTests/w3c/1.1F2/svg/shapes-rect-03-t.svg)| +|✅|[shapes-rect-04-f](Tests/SVGViewTests/w3c/1.1F2/svg/shapes-rect-04-f.svg)| +|✅|[shapes-rect-05-f](Tests/SVGViewTests/w3c/1.1F2/svg/shapes-rect-05-f.svg)| +|✅|[shapes-rect-06-f](Tests/SVGViewTests/w3c/1.1F2/svg/shapes-rect-06-f.svg)| +|❌|[shapes-rect-07-f](Tests/SVGViewTests/w3c/1.1F2/svg/shapes-rect-07-f.svg)| -### [Struct](https://www.w3.org/TR/SVG11/struct.html): `9.7%` +### [Struct](https://www.w3.org/TR/SVG11/struct.html): `12.5%`
- (7/72) tests covered... + (9/72) tests covered... |Status | Name| |------|-------| -|❌|[struct-cond-01-t](SVGViewTests/w3c/1.1F2/svg/struct-cond-01-t.svg)| -|❌|[struct-cond-02-t](SVGViewTests/w3c/1.1F2/svg/struct-cond-02-t.svg)| -|❌|[struct-cond-03-t](SVGViewTests/w3c/1.1F2/svg/struct-cond-03-t.svg)| -|❌|[struct-cond-overview-02-f](SVGViewTests/w3c/1.1F2/svg/struct-cond-overview-02-f.svg)| -|❌|[struct-cond-overview-03-f](SVGViewTests/w3c/1.1F2/svg/struct-cond-overview-03-f.svg)| -|❌|[struct-cond-overview-04-f](SVGViewTests/w3c/1.1F2/svg/struct-cond-overview-04-f.svg)| -|❌|[struct-cond-overview-05-f](SVGViewTests/w3c/1.1F2/svg/struct-cond-overview-05-f.svg)| -|✅|[struct-defs-01-t](SVGViewTests/w3c/1.1F2/svg/struct-defs-01-t.svg)| -|❌|[struct-dom-01-b](SVGViewTests/w3c/1.1F2/svg/struct-dom-01-b.svg)| -|❌|[struct-dom-02-b](SVGViewTests/w3c/1.1F2/svg/struct-dom-02-b.svg)| -|❌|[struct-dom-03-b](SVGViewTests/w3c/1.1F2/svg/struct-dom-03-b.svg)| -|❌|[struct-dom-04-b](SVGViewTests/w3c/1.1F2/svg/struct-dom-04-b.svg)| -|❌|[struct-dom-05-b](SVGViewTests/w3c/1.1F2/svg/struct-dom-05-b.svg)| -|❌|[struct-dom-06-b](SVGViewTests/w3c/1.1F2/svg/struct-dom-06-b.svg)| -|❌|[struct-dom-07-f](SVGViewTests/w3c/1.1F2/svg/struct-dom-07-f.svg)| -|❌|[struct-dom-08-f](SVGViewTests/w3c/1.1F2/svg/struct-dom-08-f.svg)| -|❌|[struct-dom-11-f](SVGViewTests/w3c/1.1F2/svg/struct-dom-11-f.svg)| -|❌|[struct-dom-12-b](SVGViewTests/w3c/1.1F2/svg/struct-dom-12-b.svg)| -|❌|[struct-dom-13-f](SVGViewTests/w3c/1.1F2/svg/struct-dom-13-f.svg)| -|❌|[struct-dom-14-f](SVGViewTests/w3c/1.1F2/svg/struct-dom-14-f.svg)| -|❌|[struct-dom-15-f](SVGViewTests/w3c/1.1F2/svg/struct-dom-15-f.svg)| -|❌|[struct-dom-16-f](SVGViewTests/w3c/1.1F2/svg/struct-dom-16-f.svg)| -|❌|[struct-dom-17-f](SVGViewTests/w3c/1.1F2/svg/struct-dom-17-f.svg)| -|❌|[struct-dom-18-f](SVGViewTests/w3c/1.1F2/svg/struct-dom-18-f.svg)| -|❌|[struct-dom-19-f](SVGViewTests/w3c/1.1F2/svg/struct-dom-19-f.svg)| -|❌|[struct-dom-20-f](SVGViewTests/w3c/1.1F2/svg/struct-dom-20-f.svg)| -|✅|[struct-frag-01-t](SVGViewTests/w3c/1.1F2/svg/struct-frag-01-t.svg)| -|❌|[struct-frag-02-t](SVGViewTests/w3c/1.1F2/svg/struct-frag-02-t.svg)| -|❌|[struct-frag-03-t](SVGViewTests/w3c/1.1F2/svg/struct-frag-03-t.svg)| -|❌|[struct-frag-04-t](SVGViewTests/w3c/1.1F2/svg/struct-frag-04-t.svg)| -|❌|[struct-frag-05-t](SVGViewTests/w3c/1.1F2/svg/struct-frag-05-t.svg)| -|✅|[struct-frag-06-t](SVGViewTests/w3c/1.1F2/svg/struct-frag-06-t.svg)| -|✅|[struct-group-01-t](SVGViewTests/w3c/1.1F2/svg/struct-group-01-t.svg)| -|❌|[struct-group-02-b](SVGViewTests/w3c/1.1F2/svg/struct-group-02-b.svg)| -|❌|[struct-group-03-t](SVGViewTests/w3c/1.1F2/svg/struct-group-03-t.svg)| -|✅|[struct-image-01-t](SVGViewTests/w3c/1.1F2/svg/struct-image-01-t.svg)| -|❌|[struct-image-02-b](SVGViewTests/w3c/1.1F2/svg/struct-image-02-b.svg)| -|❌|[struct-image-03-t](SVGViewTests/w3c/1.1F2/svg/struct-image-03-t.svg)| -|✅|[struct-image-04-t](SVGViewTests/w3c/1.1F2/svg/struct-image-04-t.svg)| -|❌|[struct-image-05-b](SVGViewTests/w3c/1.1F2/svg/struct-image-05-b.svg)| -|❌|[struct-image-06-t](SVGViewTests/w3c/1.1F2/svg/struct-image-06-t.svg)| -|❌|[struct-image-07-t](SVGViewTests/w3c/1.1F2/svg/struct-image-07-t.svg)| -|❌|[struct-image-08-t](SVGViewTests/w3c/1.1F2/svg/struct-image-08-t.svg)| -|❌|[struct-image-09-t](SVGViewTests/w3c/1.1F2/svg/struct-image-09-t.svg)| -|❌|[struct-image-10-t](SVGViewTests/w3c/1.1F2/svg/struct-image-10-t.svg)| -|❌|[struct-image-11-b](SVGViewTests/w3c/1.1F2/svg/struct-image-11-b.svg)| -|❌|[struct-image-12-b](SVGViewTests/w3c/1.1F2/svg/struct-image-12-b.svg)| -|❌|[struct-image-13-f](SVGViewTests/w3c/1.1F2/svg/struct-image-13-f.svg)| -|❌|[struct-image-14-f](SVGViewTests/w3c/1.1F2/svg/struct-image-14-f.svg)| -|❌|[struct-image-15-f](SVGViewTests/w3c/1.1F2/svg/struct-image-15-f.svg)| -|❌|[struct-image-16-f](SVGViewTests/w3c/1.1F2/svg/struct-image-16-f.svg)| -|❌|[struct-image-17-b](SVGViewTests/w3c/1.1F2/svg/struct-image-17-b.svg)| -|❌|[struct-image-18-f](SVGViewTests/w3c/1.1F2/svg/struct-image-18-f.svg)| -|❌|[struct-image-19-f](SVGViewTests/w3c/1.1F2/svg/struct-image-19-f.svg)| -|❌|[struct-svg-01-f](SVGViewTests/w3c/1.1F2/svg/struct-svg-01-f.svg)| -|❌|[struct-svg-02-f](SVGViewTests/w3c/1.1F2/svg/struct-svg-02-f.svg)| -|❌|[struct-svg-03-f](SVGViewTests/w3c/1.1F2/svg/struct-svg-03-f.svg)| -|❌|[struct-symbol-01-b](SVGViewTests/w3c/1.1F2/svg/struct-symbol-01-b.svg)| -|❌|[struct-use-01-t](SVGViewTests/w3c/1.1F2/svg/struct-use-01-t.svg)| -|✅|[struct-use-03-t](SVGViewTests/w3c/1.1F2/svg/struct-use-03-t.svg)| -|❌|[struct-use-04-b](SVGViewTests/w3c/1.1F2/svg/struct-use-04-b.svg)| -|❌|[struct-use-05-b](SVGViewTests/w3c/1.1F2/svg/struct-use-05-b.svg)| -|❌|[struct-use-06-b](SVGViewTests/w3c/1.1F2/svg/struct-use-06-b.svg)| -|❌|[struct-use-07-b](SVGViewTests/w3c/1.1F2/svg/struct-use-07-b.svg)| -|❌|[struct-use-08-b](SVGViewTests/w3c/1.1F2/svg/struct-use-08-b.svg)| -|❌|[struct-use-09-b](SVGViewTests/w3c/1.1F2/svg/struct-use-09-b.svg)| -|❌|[struct-use-10-f](SVGViewTests/w3c/1.1F2/svg/struct-use-10-f.svg)| -|❌|[struct-use-11-f](SVGViewTests/w3c/1.1F2/svg/struct-use-11-f.svg)| -|❌|[struct-use-12-f](SVGViewTests/w3c/1.1F2/svg/struct-use-12-f.svg)| -|❌|[struct-use-13-f](SVGViewTests/w3c/1.1F2/svg/struct-use-13-f.svg)| -|❌|[struct-use-14-f](SVGViewTests/w3c/1.1F2/svg/struct-use-14-f.svg)| -|❌|[struct-use-15-f](SVGViewTests/w3c/1.1F2/svg/struct-use-15-f.svg)| +|✅|[struct-cond-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/struct-cond-01-t.svg)| +|❌|[struct-cond-02-t](Tests/SVGViewTests/w3c/1.1F2/svg/struct-cond-02-t.svg)| +|✅|[struct-cond-03-t](Tests/SVGViewTests/w3c/1.1F2/svg/struct-cond-03-t.svg)| +|❌|[struct-cond-overview-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-cond-overview-02-f.svg)| +|❌|[struct-cond-overview-03-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-cond-overview-03-f.svg)| +|❌|[struct-cond-overview-04-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-cond-overview-04-f.svg)| +|❌|[struct-cond-overview-05-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-cond-overview-05-f.svg)| +|✅|[struct-defs-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/struct-defs-01-t.svg)| +|❌|[struct-dom-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/struct-dom-01-b.svg)| +|❌|[struct-dom-02-b](Tests/SVGViewTests/w3c/1.1F2/svg/struct-dom-02-b.svg)| +|❌|[struct-dom-03-b](Tests/SVGViewTests/w3c/1.1F2/svg/struct-dom-03-b.svg)| +|❌|[struct-dom-04-b](Tests/SVGViewTests/w3c/1.1F2/svg/struct-dom-04-b.svg)| +|❌|[struct-dom-05-b](Tests/SVGViewTests/w3c/1.1F2/svg/struct-dom-05-b.svg)| +|❌|[struct-dom-06-b](Tests/SVGViewTests/w3c/1.1F2/svg/struct-dom-06-b.svg)| +|❌|[struct-dom-07-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-dom-07-f.svg)| +|❌|[struct-dom-08-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-dom-08-f.svg)| +|❌|[struct-dom-11-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-dom-11-f.svg)| +|❌|[struct-dom-12-b](Tests/SVGViewTests/w3c/1.1F2/svg/struct-dom-12-b.svg)| +|❌|[struct-dom-13-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-dom-13-f.svg)| +|❌|[struct-dom-14-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-dom-14-f.svg)| +|❌|[struct-dom-15-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-dom-15-f.svg)| +|❌|[struct-dom-16-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-dom-16-f.svg)| +|❌|[struct-dom-17-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-dom-17-f.svg)| +|❌|[struct-dom-18-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-dom-18-f.svg)| +|❌|[struct-dom-19-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-dom-19-f.svg)| +|❌|[struct-dom-20-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-dom-20-f.svg)| +|✅|[struct-frag-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/struct-frag-01-t.svg)| +|❌|[struct-frag-02-t](Tests/SVGViewTests/w3c/1.1F2/svg/struct-frag-02-t.svg)| +|❌|[struct-frag-03-t](Tests/SVGViewTests/w3c/1.1F2/svg/struct-frag-03-t.svg)| +|❌|[struct-frag-04-t](Tests/SVGViewTests/w3c/1.1F2/svg/struct-frag-04-t.svg)| +|❌|[struct-frag-05-t](Tests/SVGViewTests/w3c/1.1F2/svg/struct-frag-05-t.svg)| +|✅|[struct-frag-06-t](Tests/SVGViewTests/w3c/1.1F2/svg/struct-frag-06-t.svg)| +|✅|[struct-group-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/struct-group-01-t.svg)| +|❌|[struct-group-02-b](Tests/SVGViewTests/w3c/1.1F2/svg/struct-group-02-b.svg)| +|❌|[struct-group-03-t](Tests/SVGViewTests/w3c/1.1F2/svg/struct-group-03-t.svg)| +|✅|[struct-image-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/struct-image-01-t.svg)| +|❌|[struct-image-02-b](Tests/SVGViewTests/w3c/1.1F2/svg/struct-image-02-b.svg)| +|❌|[struct-image-03-t](Tests/SVGViewTests/w3c/1.1F2/svg/struct-image-03-t.svg)| +|✅|[struct-image-04-t](Tests/SVGViewTests/w3c/1.1F2/svg/struct-image-04-t.svg)| +|❌|[struct-image-05-b](Tests/SVGViewTests/w3c/1.1F2/svg/struct-image-05-b.svg)| +|❌|[struct-image-06-t](Tests/SVGViewTests/w3c/1.1F2/svg/struct-image-06-t.svg)| +|❌|[struct-image-07-t](Tests/SVGViewTests/w3c/1.1F2/svg/struct-image-07-t.svg)| +|❌|[struct-image-08-t](Tests/SVGViewTests/w3c/1.1F2/svg/struct-image-08-t.svg)| +|❌|[struct-image-09-t](Tests/SVGViewTests/w3c/1.1F2/svg/struct-image-09-t.svg)| +|❌|[struct-image-10-t](Tests/SVGViewTests/w3c/1.1F2/svg/struct-image-10-t.svg)| +|❌|[struct-image-11-b](Tests/SVGViewTests/w3c/1.1F2/svg/struct-image-11-b.svg)| +|❌|[struct-image-12-b](Tests/SVGViewTests/w3c/1.1F2/svg/struct-image-12-b.svg)| +|❌|[struct-image-13-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-image-13-f.svg)| +|❌|[struct-image-14-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-image-14-f.svg)| +|❌|[struct-image-15-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-image-15-f.svg)| +|❌|[struct-image-16-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-image-16-f.svg)| +|❌|[struct-image-17-b](Tests/SVGViewTests/w3c/1.1F2/svg/struct-image-17-b.svg)| +|❌|[struct-image-18-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-image-18-f.svg)| +|❌|[struct-image-19-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-image-19-f.svg)| +|❌|[struct-svg-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-svg-01-f.svg)| +|❌|[struct-svg-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-svg-02-f.svg)| +|❌|[struct-svg-03-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-svg-03-f.svg)| +|❌|[struct-symbol-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/struct-symbol-01-b.svg)| +|❌|[struct-use-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/struct-use-01-t.svg)| +|✅|[struct-use-03-t](Tests/SVGViewTests/w3c/1.1F2/svg/struct-use-03-t.svg)| +|❌|[struct-use-04-b](Tests/SVGViewTests/w3c/1.1F2/svg/struct-use-04-b.svg)| +|❌|[struct-use-05-b](Tests/SVGViewTests/w3c/1.1F2/svg/struct-use-05-b.svg)| +|❌|[struct-use-06-b](Tests/SVGViewTests/w3c/1.1F2/svg/struct-use-06-b.svg)| +|❌|[struct-use-07-b](Tests/SVGViewTests/w3c/1.1F2/svg/struct-use-07-b.svg)| +|❌|[struct-use-08-b](Tests/SVGViewTests/w3c/1.1F2/svg/struct-use-08-b.svg)| +|❌|[struct-use-09-b](Tests/SVGViewTests/w3c/1.1F2/svg/struct-use-09-b.svg)| +|❌|[struct-use-10-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-use-10-f.svg)| +|❌|[struct-use-11-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-use-11-f.svg)| +|❌|[struct-use-12-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-use-12-f.svg)| +|❌|[struct-use-13-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-use-13-f.svg)| +|❌|[struct-use-14-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-use-14-f.svg)| +|❌|[struct-use-15-f](Tests/SVGViewTests/w3c/1.1F2/svg/struct-use-15-f.svg)|
### [Styling](https://www.w3.org/TR/SVG11/styling.html): `16.6%` @@ -661,24 +661,24 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|✅|[styling-class-01-f](SVGViewTests/w3c/1.1F2/svg/styling-class-01-f.svg)| -|✅|[styling-css-01-b](SVGViewTests/w3c/1.1F2/svg/styling-css-01-b.svg)| -|❌|[styling-css-02-b](SVGViewTests/w3c/1.1F2/svg/styling-css-02-b.svg)| -|❌|[styling-css-03-b](SVGViewTests/w3c/1.1F2/svg/styling-css-03-b.svg)| -|❌|[styling-css-04-f](SVGViewTests/w3c/1.1F2/svg/styling-css-04-f.svg)| -|❌|[styling-css-05-b](SVGViewTests/w3c/1.1F2/svg/styling-css-05-b.svg)| -|❌|[styling-css-06-b](SVGViewTests/w3c/1.1F2/svg/styling-css-06-b.svg)| -|❌|[styling-css-07-f](SVGViewTests/w3c/1.1F2/svg/styling-css-07-f.svg)| -|❌|[styling-css-08-f](SVGViewTests/w3c/1.1F2/svg/styling-css-08-f.svg)| -|❌|[styling-css-09-f](SVGViewTests/w3c/1.1F2/svg/styling-css-09-f.svg)| -|❌|[styling-css-10-f](SVGViewTests/w3c/1.1F2/svg/styling-css-10-f.svg)| -|❌|[styling-elem-01-b](SVGViewTests/w3c/1.1F2/svg/styling-elem-01-b.svg)| -|❌|[styling-inherit-01-b](SVGViewTests/w3c/1.1F2/svg/styling-inherit-01-b.svg)| -|✅|[styling-pres-01-t](SVGViewTests/w3c/1.1F2/svg/styling-pres-01-t.svg)| -|❌|[styling-pres-02-f](SVGViewTests/w3c/1.1F2/svg/styling-pres-02-f.svg)| -|❌|[styling-pres-03-f](SVGViewTests/w3c/1.1F2/svg/styling-pres-03-f.svg)| -|❌|[styling-pres-04-f](SVGViewTests/w3c/1.1F2/svg/styling-pres-04-f.svg)| -|❌|[styling-pres-05-f](SVGViewTests/w3c/1.1F2/svg/styling-pres-05-f.svg)| +|✅|[styling-class-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/styling-class-01-f.svg)| +|✅|[styling-css-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/styling-css-01-b.svg)| +|❌|[styling-css-02-b](Tests/SVGViewTests/w3c/1.1F2/svg/styling-css-02-b.svg)| +|❌|[styling-css-03-b](Tests/SVGViewTests/w3c/1.1F2/svg/styling-css-03-b.svg)| +|❌|[styling-css-04-f](Tests/SVGViewTests/w3c/1.1F2/svg/styling-css-04-f.svg)| +|❌|[styling-css-05-b](Tests/SVGViewTests/w3c/1.1F2/svg/styling-css-05-b.svg)| +|❌|[styling-css-06-b](Tests/SVGViewTests/w3c/1.1F2/svg/styling-css-06-b.svg)| +|❌|[styling-css-07-f](Tests/SVGViewTests/w3c/1.1F2/svg/styling-css-07-f.svg)| +|❌|[styling-css-08-f](Tests/SVGViewTests/w3c/1.1F2/svg/styling-css-08-f.svg)| +|❌|[styling-css-09-f](Tests/SVGViewTests/w3c/1.1F2/svg/styling-css-09-f.svg)| +|❌|[styling-css-10-f](Tests/SVGViewTests/w3c/1.1F2/svg/styling-css-10-f.svg)| +|❌|[styling-elem-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/styling-elem-01-b.svg)| +|❌|[styling-inherit-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/styling-inherit-01-b.svg)| +|✅|[styling-pres-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/styling-pres-01-t.svg)| +|❌|[styling-pres-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/styling-pres-02-f.svg)| +|❌|[styling-pres-03-f](Tests/SVGViewTests/w3c/1.1F2/svg/styling-pres-03-f.svg)| +|❌|[styling-pres-04-f](Tests/SVGViewTests/w3c/1.1F2/svg/styling-pres-04-f.svg)| +|❌|[styling-pres-05-f](Tests/SVGViewTests/w3c/1.1F2/svg/styling-pres-05-f.svg)| ### [Svgdom](https://www.w3.org/TR/SVG11/svgdom.html): `0.0%` @@ -688,7 +688,7 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[svgdom-over-01-f](SVGViewTests/w3c/1.1F2/svg/svgdom-over-01-f.svg)| +|❌|[svgdom-over-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/svgdom-over-01-f.svg)| ### [Text](https://www.w3.org/TR/SVG11/text.html): `0.0%` @@ -698,65 +698,65 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[text-align-01-b](SVGViewTests/w3c/1.1F2/svg/text-align-01-b.svg)| -|❌|[text-align-02-b](SVGViewTests/w3c/1.1F2/svg/text-align-02-b.svg)| -|❌|[text-align-03-b](SVGViewTests/w3c/1.1F2/svg/text-align-03-b.svg)| -|❌|[text-align-04-b](SVGViewTests/w3c/1.1F2/svg/text-align-04-b.svg)| -|❌|[text-align-05-b](SVGViewTests/w3c/1.1F2/svg/text-align-05-b.svg)| -|❌|[text-align-06-b](SVGViewTests/w3c/1.1F2/svg/text-align-06-b.svg)| -|❌|[text-align-07-t](SVGViewTests/w3c/1.1F2/svg/text-align-07-t.svg)| -|❌|[text-align-08-b](SVGViewTests/w3c/1.1F2/svg/text-align-08-b.svg)| -|❌|[text-altglyph-01-b](SVGViewTests/w3c/1.1F2/svg/text-altglyph-01-b.svg)| -|❌|[text-altglyph-02-b](SVGViewTests/w3c/1.1F2/svg/text-altglyph-02-b.svg)| -|❌|[text-altglyph-03-b](SVGViewTests/w3c/1.1F2/svg/text-altglyph-03-b.svg)| -|❌|[text-bidi-01-t](SVGViewTests/w3c/1.1F2/svg/text-bidi-01-t.svg)| -|❌|[text-deco-01-b](SVGViewTests/w3c/1.1F2/svg/text-deco-01-b.svg)| -|❌|[text-dom-01-f](SVGViewTests/w3c/1.1F2/svg/text-dom-01-f.svg)| -|❌|[text-dom-02-f](SVGViewTests/w3c/1.1F2/svg/text-dom-02-f.svg)| -|❌|[text-dom-03-f](SVGViewTests/w3c/1.1F2/svg/text-dom-03-f.svg)| -|❌|[text-dom-04-f](SVGViewTests/w3c/1.1F2/svg/text-dom-04-f.svg)| -|❌|[text-dom-05-f](SVGViewTests/w3c/1.1F2/svg/text-dom-05-f.svg)| -|❌|[text-fonts-01-t](SVGViewTests/w3c/1.1F2/svg/text-fonts-01-t.svg)| -|❌|[text-fonts-02-t](SVGViewTests/w3c/1.1F2/svg/text-fonts-02-t.svg)| -|❌|[text-fonts-03-t](SVGViewTests/w3c/1.1F2/svg/text-fonts-03-t.svg)| -|❌|[text-fonts-04-t](SVGViewTests/w3c/1.1F2/svg/text-fonts-04-t.svg)| -|❌|[text-fonts-05-f](SVGViewTests/w3c/1.1F2/svg/text-fonts-05-f.svg)| -|❌|[text-fonts-202-t](SVGViewTests/w3c/1.1F2/svg/text-fonts-202-t.svg)| -|❌|[text-fonts-203-t](SVGViewTests/w3c/1.1F2/svg/text-fonts-203-t.svg)| -|❌|[text-fonts-204-t](SVGViewTests/w3c/1.1F2/svg/text-fonts-204-t.svg)| -|❌|[text-intro-01-t](SVGViewTests/w3c/1.1F2/svg/text-intro-01-t.svg)| -|❌|[text-intro-02-b](SVGViewTests/w3c/1.1F2/svg/text-intro-02-b.svg)| -|❌|[text-intro-03-b](SVGViewTests/w3c/1.1F2/svg/text-intro-03-b.svg)| -|❌|[text-intro-04-t](SVGViewTests/w3c/1.1F2/svg/text-intro-04-t.svg)| -|❌|[text-intro-05-t](SVGViewTests/w3c/1.1F2/svg/text-intro-05-t.svg)| -|❌|[text-intro-06-t](SVGViewTests/w3c/1.1F2/svg/text-intro-06-t.svg)| -|❌|[text-intro-07-t](SVGViewTests/w3c/1.1F2/svg/text-intro-07-t.svg)| -|❌|[text-intro-09-b](SVGViewTests/w3c/1.1F2/svg/text-intro-09-b.svg)| -|❌|[text-intro-10-f](SVGViewTests/w3c/1.1F2/svg/text-intro-10-f.svg)| -|❌|[text-intro-11-t](SVGViewTests/w3c/1.1F2/svg/text-intro-11-t.svg)| -|❌|[text-intro-12-t](SVGViewTests/w3c/1.1F2/svg/text-intro-12-t.svg)| -|❌|[text-path-01-b](SVGViewTests/w3c/1.1F2/svg/text-path-01-b.svg)| -|❌|[text-path-02-b](SVGViewTests/w3c/1.1F2/svg/text-path-02-b.svg)| -|❌|[text-spacing-01-b](SVGViewTests/w3c/1.1F2/svg/text-spacing-01-b.svg)| -|❌|[text-text-01-b](SVGViewTests/w3c/1.1F2/svg/text-text-01-b.svg)| -|❌|[text-text-03-b](SVGViewTests/w3c/1.1F2/svg/text-text-03-b.svg)| -|❌|[text-text-04-t](SVGViewTests/w3c/1.1F2/svg/text-text-04-t.svg)| -|❌|[text-text-05-t](SVGViewTests/w3c/1.1F2/svg/text-text-05-t.svg)| -|❌|[text-text-06-t](SVGViewTests/w3c/1.1F2/svg/text-text-06-t.svg)| -|❌|[text-text-07-t](SVGViewTests/w3c/1.1F2/svg/text-text-07-t.svg)| -|❌|[text-text-08-b](SVGViewTests/w3c/1.1F2/svg/text-text-08-b.svg)| -|❌|[text-text-09-t](SVGViewTests/w3c/1.1F2/svg/text-text-09-t.svg)| -|❌|[text-text-10-t](SVGViewTests/w3c/1.1F2/svg/text-text-10-t.svg)| -|❌|[text-text-11-t](SVGViewTests/w3c/1.1F2/svg/text-text-11-t.svg)| -|❌|[text-text-12-t](SVGViewTests/w3c/1.1F2/svg/text-text-12-t.svg)| -|❌|[text-tref-01-b](SVGViewTests/w3c/1.1F2/svg/text-tref-01-b.svg)| -|❌|[text-tref-02-b](SVGViewTests/w3c/1.1F2/svg/text-tref-02-b.svg)| -|❌|[text-tref-03-b](SVGViewTests/w3c/1.1F2/svg/text-tref-03-b.svg)| -|❌|[text-tselect-01-b](SVGViewTests/w3c/1.1F2/svg/text-tselect-01-b.svg)| -|❌|[text-tselect-02-f](SVGViewTests/w3c/1.1F2/svg/text-tselect-02-f.svg)| -|❌|[text-tselect-03-f](SVGViewTests/w3c/1.1F2/svg/text-tselect-03-f.svg)| -|❌|[text-tspan-01-b](SVGViewTests/w3c/1.1F2/svg/text-tspan-01-b.svg)| -|❌|[text-tspan-02-b](SVGViewTests/w3c/1.1F2/svg/text-tspan-02-b.svg)| +|❌|[text-align-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/text-align-01-b.svg)| +|❌|[text-align-02-b](Tests/SVGViewTests/w3c/1.1F2/svg/text-align-02-b.svg)| +|❌|[text-align-03-b](Tests/SVGViewTests/w3c/1.1F2/svg/text-align-03-b.svg)| +|❌|[text-align-04-b](Tests/SVGViewTests/w3c/1.1F2/svg/text-align-04-b.svg)| +|❌|[text-align-05-b](Tests/SVGViewTests/w3c/1.1F2/svg/text-align-05-b.svg)| +|❌|[text-align-06-b](Tests/SVGViewTests/w3c/1.1F2/svg/text-align-06-b.svg)| +|❌|[text-align-07-t](Tests/SVGViewTests/w3c/1.1F2/svg/text-align-07-t.svg)| +|❌|[text-align-08-b](Tests/SVGViewTests/w3c/1.1F2/svg/text-align-08-b.svg)| +|❌|[text-altglyph-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/text-altglyph-01-b.svg)| +|❌|[text-altglyph-02-b](Tests/SVGViewTests/w3c/1.1F2/svg/text-altglyph-02-b.svg)| +|❌|[text-altglyph-03-b](Tests/SVGViewTests/w3c/1.1F2/svg/text-altglyph-03-b.svg)| +|❌|[text-bidi-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/text-bidi-01-t.svg)| +|❌|[text-deco-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/text-deco-01-b.svg)| +|❌|[text-dom-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/text-dom-01-f.svg)| +|❌|[text-dom-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/text-dom-02-f.svg)| +|❌|[text-dom-03-f](Tests/SVGViewTests/w3c/1.1F2/svg/text-dom-03-f.svg)| +|❌|[text-dom-04-f](Tests/SVGViewTests/w3c/1.1F2/svg/text-dom-04-f.svg)| +|❌|[text-dom-05-f](Tests/SVGViewTests/w3c/1.1F2/svg/text-dom-05-f.svg)| +|❌|[text-fonts-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/text-fonts-01-t.svg)| +|❌|[text-fonts-02-t](Tests/SVGViewTests/w3c/1.1F2/svg/text-fonts-02-t.svg)| +|❌|[text-fonts-03-t](Tests/SVGViewTests/w3c/1.1F2/svg/text-fonts-03-t.svg)| +|❌|[text-fonts-04-t](Tests/SVGViewTests/w3c/1.1F2/svg/text-fonts-04-t.svg)| +|❌|[text-fonts-05-f](Tests/SVGViewTests/w3c/1.1F2/svg/text-fonts-05-f.svg)| +|❌|[text-fonts-202-t](Tests/SVGViewTests/w3c/1.1F2/svg/text-fonts-202-t.svg)| +|❌|[text-fonts-203-t](Tests/SVGViewTests/w3c/1.1F2/svg/text-fonts-203-t.svg)| +|❌|[text-fonts-204-t](Tests/SVGViewTests/w3c/1.1F2/svg/text-fonts-204-t.svg)| +|❌|[text-intro-01-t](Tests/SVGViewTests/w3c/1.1F2/svg/text-intro-01-t.svg)| +|❌|[text-intro-02-b](Tests/SVGViewTests/w3c/1.1F2/svg/text-intro-02-b.svg)| +|❌|[text-intro-03-b](Tests/SVGViewTests/w3c/1.1F2/svg/text-intro-03-b.svg)| +|❌|[text-intro-04-t](Tests/SVGViewTests/w3c/1.1F2/svg/text-intro-04-t.svg)| +|❌|[text-intro-05-t](Tests/SVGViewTests/w3c/1.1F2/svg/text-intro-05-t.svg)| +|❌|[text-intro-06-t](Tests/SVGViewTests/w3c/1.1F2/svg/text-intro-06-t.svg)| +|❌|[text-intro-07-t](Tests/SVGViewTests/w3c/1.1F2/svg/text-intro-07-t.svg)| +|❌|[text-intro-09-b](Tests/SVGViewTests/w3c/1.1F2/svg/text-intro-09-b.svg)| +|❌|[text-intro-10-f](Tests/SVGViewTests/w3c/1.1F2/svg/text-intro-10-f.svg)| +|❌|[text-intro-11-t](Tests/SVGViewTests/w3c/1.1F2/svg/text-intro-11-t.svg)| +|❌|[text-intro-12-t](Tests/SVGViewTests/w3c/1.1F2/svg/text-intro-12-t.svg)| +|❌|[text-path-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/text-path-01-b.svg)| +|❌|[text-path-02-b](Tests/SVGViewTests/w3c/1.1F2/svg/text-path-02-b.svg)| +|❌|[text-spacing-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/text-spacing-01-b.svg)| +|❌|[text-text-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/text-text-01-b.svg)| +|❌|[text-text-03-b](Tests/SVGViewTests/w3c/1.1F2/svg/text-text-03-b.svg)| +|❌|[text-text-04-t](Tests/SVGViewTests/w3c/1.1F2/svg/text-text-04-t.svg)| +|❌|[text-text-05-t](Tests/SVGViewTests/w3c/1.1F2/svg/text-text-05-t.svg)| +|❌|[text-text-06-t](Tests/SVGViewTests/w3c/1.1F2/svg/text-text-06-t.svg)| +|❌|[text-text-07-t](Tests/SVGViewTests/w3c/1.1F2/svg/text-text-07-t.svg)| +|❌|[text-text-08-b](Tests/SVGViewTests/w3c/1.1F2/svg/text-text-08-b.svg)| +|❌|[text-text-09-t](Tests/SVGViewTests/w3c/1.1F2/svg/text-text-09-t.svg)| +|❌|[text-text-10-t](Tests/SVGViewTests/w3c/1.1F2/svg/text-text-10-t.svg)| +|❌|[text-text-11-t](Tests/SVGViewTests/w3c/1.1F2/svg/text-text-11-t.svg)| +|❌|[text-text-12-t](Tests/SVGViewTests/w3c/1.1F2/svg/text-text-12-t.svg)| +|❌|[text-tref-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/text-tref-01-b.svg)| +|❌|[text-tref-02-b](Tests/SVGViewTests/w3c/1.1F2/svg/text-tref-02-b.svg)| +|❌|[text-tref-03-b](Tests/SVGViewTests/w3c/1.1F2/svg/text-tref-03-b.svg)| +|❌|[text-tselect-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/text-tselect-01-b.svg)| +|❌|[text-tselect-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/text-tselect-02-f.svg)| +|❌|[text-tselect-03-f](Tests/SVGViewTests/w3c/1.1F2/svg/text-tselect-03-f.svg)| +|❌|[text-tspan-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/text-tspan-01-b.svg)| +|❌|[text-tspan-02-b](Tests/SVGViewTests/w3c/1.1F2/svg/text-tspan-02-b.svg)| ### [Types](https://www.w3.org/TR/SVG11/types.html): `6.6%` @@ -766,21 +766,21 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|✅|[types-basic-01-f](SVGViewTests/w3c/1.1F2/svg/types-basic-01-f.svg)| -|❌|[types-basic-02-f](SVGViewTests/w3c/1.1F2/svg/types-basic-02-f.svg)| -|❌|[types-dom-01-b](SVGViewTests/w3c/1.1F2/svg/types-dom-01-b.svg)| -|❌|[types-dom-02-f](SVGViewTests/w3c/1.1F2/svg/types-dom-02-f.svg)| -|❌|[types-dom-03-b](SVGViewTests/w3c/1.1F2/svg/types-dom-03-b.svg)| -|❌|[types-dom-04-b](SVGViewTests/w3c/1.1F2/svg/types-dom-04-b.svg)| -|❌|[types-dom-05-b](SVGViewTests/w3c/1.1F2/svg/types-dom-05-b.svg)| -|❌|[types-dom-06-f](SVGViewTests/w3c/1.1F2/svg/types-dom-06-f.svg)| -|❌|[types-dom-07-f](SVGViewTests/w3c/1.1F2/svg/types-dom-07-f.svg)| -|❌|[types-dom-08-f](SVGViewTests/w3c/1.1F2/svg/types-dom-08-f.svg)| -|❌|[types-dom-svgfittoviewbox-01-f](SVGViewTests/w3c/1.1F2/svg/types-dom-svgfittoviewbox-01-f.svg)| -|❌|[types-dom-svglengthlist-01-f](SVGViewTests/w3c/1.1F2/svg/types-dom-svglengthlist-01-f.svg)| -|❌|[types-dom-svgnumberlist-01-f](SVGViewTests/w3c/1.1F2/svg/types-dom-svgnumberlist-01-f.svg)| -|❌|[types-dom-svgstringlist-01-f](SVGViewTests/w3c/1.1F2/svg/types-dom-svgstringlist-01-f.svg)| -|❌|[types-dom-svgtransformable-01-f](SVGViewTests/w3c/1.1F2/svg/types-dom-svgtransformable-01-f.svg)| +|✅|[types-basic-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/types-basic-01-f.svg)| +|❌|[types-basic-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/types-basic-02-f.svg)| +|❌|[types-dom-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/types-dom-01-b.svg)| +|❌|[types-dom-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/types-dom-02-f.svg)| +|❌|[types-dom-03-b](Tests/SVGViewTests/w3c/1.1F2/svg/types-dom-03-b.svg)| +|❌|[types-dom-04-b](Tests/SVGViewTests/w3c/1.1F2/svg/types-dom-04-b.svg)| +|❌|[types-dom-05-b](Tests/SVGViewTests/w3c/1.1F2/svg/types-dom-05-b.svg)| +|❌|[types-dom-06-f](Tests/SVGViewTests/w3c/1.1F2/svg/types-dom-06-f.svg)| +|❌|[types-dom-07-f](Tests/SVGViewTests/w3c/1.1F2/svg/types-dom-07-f.svg)| +|❌|[types-dom-08-f](Tests/SVGViewTests/w3c/1.1F2/svg/types-dom-08-f.svg)| +|❌|[types-dom-svgfittoviewbox-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/types-dom-svgfittoviewbox-01-f.svg)| +|❌|[types-dom-svglengthlist-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/types-dom-svglengthlist-01-f.svg)| +|❌|[types-dom-svgnumberlist-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/types-dom-svgnumberlist-01-f.svg)| +|❌|[types-dom-svgstringlist-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/types-dom-svgstringlist-01-f.svg)| +|❌|[types-dom-svgtransformable-01-f](Tests/SVGViewTests/w3c/1.1F2/svg/types-dom-svgtransformable-01-f.svg)| ## [SVG Tiny 1.2](https://www.w3.org/TR/SVGTiny12/) @@ -794,95 +794,95 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[animate-elem-02-t](SVGViewTests/w3c/1.2T/svg/animate-elem-02-t.svg)| -|❌|[animate-elem-03-t](SVGViewTests/w3c/1.2T/svg/animate-elem-03-t.svg)| -|❌|[animate-elem-04-t](SVGViewTests/w3c/1.2T/svg/animate-elem-04-t.svg)| -|❌|[animate-elem-05-t](SVGViewTests/w3c/1.2T/svg/animate-elem-05-t.svg)| -|❌|[animate-elem-06-t](SVGViewTests/w3c/1.2T/svg/animate-elem-06-t.svg)| -|❌|[animate-elem-07-t](SVGViewTests/w3c/1.2T/svg/animate-elem-07-t.svg)| -|❌|[animate-elem-08-t](SVGViewTests/w3c/1.2T/svg/animate-elem-08-t.svg)| -|❌|[animate-elem-09-t](SVGViewTests/w3c/1.2T/svg/animate-elem-09-t.svg)| -|❌|[animate-elem-10-t](SVGViewTests/w3c/1.2T/svg/animate-elem-10-t.svg)| -|❌|[animate-elem-11-t](SVGViewTests/w3c/1.2T/svg/animate-elem-11-t.svg)| -|❌|[animate-elem-12-t](SVGViewTests/w3c/1.2T/svg/animate-elem-12-t.svg)| -|❌|[animate-elem-13-t](SVGViewTests/w3c/1.2T/svg/animate-elem-13-t.svg)| -|❌|[animate-elem-14-t](SVGViewTests/w3c/1.2T/svg/animate-elem-14-t.svg)| -|❌|[animate-elem-15-t](SVGViewTests/w3c/1.2T/svg/animate-elem-15-t.svg)| -|❌|[animate-elem-17-t](SVGViewTests/w3c/1.2T/svg/animate-elem-17-t.svg)| -|❌|[animate-elem-19-t](SVGViewTests/w3c/1.2T/svg/animate-elem-19-t.svg)| -|❌|[animate-elem-20-t](SVGViewTests/w3c/1.2T/svg/animate-elem-20-t.svg)| -|❌|[animate-elem-201-t](SVGViewTests/w3c/1.2T/svg/animate-elem-201-t.svg)| -|❌|[animate-elem-202-t](SVGViewTests/w3c/1.2T/svg/animate-elem-202-t.svg)| -|❌|[animate-elem-203-t](SVGViewTests/w3c/1.2T/svg/animate-elem-203-t.svg)| -|❌|[animate-elem-204-t](SVGViewTests/w3c/1.2T/svg/animate-elem-204-t.svg)| -|❌|[animate-elem-205-t](SVGViewTests/w3c/1.2T/svg/animate-elem-205-t.svg)| -|❌|[animate-elem-206-t](SVGViewTests/w3c/1.2T/svg/animate-elem-206-t.svg)| -|❌|[animate-elem-207-t](SVGViewTests/w3c/1.2T/svg/animate-elem-207-t.svg)| -|❌|[animate-elem-208-t](SVGViewTests/w3c/1.2T/svg/animate-elem-208-t.svg)| -|❌|[animate-elem-209-t](SVGViewTests/w3c/1.2T/svg/animate-elem-209-t.svg)| -|❌|[animate-elem-21-t](SVGViewTests/w3c/1.2T/svg/animate-elem-21-t.svg)| -|❌|[animate-elem-210-t](SVGViewTests/w3c/1.2T/svg/animate-elem-210-t.svg)| -|❌|[animate-elem-211-t](SVGViewTests/w3c/1.2T/svg/animate-elem-211-t.svg)| -|❌|[animate-elem-212-t](SVGViewTests/w3c/1.2T/svg/animate-elem-212-t.svg)| -|❌|[animate-elem-213-t](SVGViewTests/w3c/1.2T/svg/animate-elem-213-t.svg)| -|❌|[animate-elem-214-t](SVGViewTests/w3c/1.2T/svg/animate-elem-214-t.svg)| -|❌|[animate-elem-215-t](SVGViewTests/w3c/1.2T/svg/animate-elem-215-t.svg)| -|❌|[animate-elem-216-t](SVGViewTests/w3c/1.2T/svg/animate-elem-216-t.svg)| -|❌|[animate-elem-217-t](SVGViewTests/w3c/1.2T/svg/animate-elem-217-t.svg)| -|❌|[animate-elem-218-t](SVGViewTests/w3c/1.2T/svg/animate-elem-218-t.svg)| -|❌|[animate-elem-219-t](SVGViewTests/w3c/1.2T/svg/animate-elem-219-t.svg)| -|❌|[animate-elem-22-t](SVGViewTests/w3c/1.2T/svg/animate-elem-22-t.svg)| -|❌|[animate-elem-220-t](SVGViewTests/w3c/1.2T/svg/animate-elem-220-t.svg)| -|❌|[animate-elem-221-t](SVGViewTests/w3c/1.2T/svg/animate-elem-221-t.svg)| -|❌|[animate-elem-222-t](SVGViewTests/w3c/1.2T/svg/animate-elem-222-t.svg)| -|❌|[animate-elem-223-t](SVGViewTests/w3c/1.2T/svg/animate-elem-223-t.svg)| -|❌|[animate-elem-224-t](SVGViewTests/w3c/1.2T/svg/animate-elem-224-t.svg)| -|❌|[animate-elem-225-t](SVGViewTests/w3c/1.2T/svg/animate-elem-225-t.svg)| -|❌|[animate-elem-226-t](SVGViewTests/w3c/1.2T/svg/animate-elem-226-t.svg)| -|❌|[animate-elem-227-t](SVGViewTests/w3c/1.2T/svg/animate-elem-227-t.svg)| -|❌|[animate-elem-23-t](SVGViewTests/w3c/1.2T/svg/animate-elem-23-t.svg)| -|❌|[animate-elem-24-t](SVGViewTests/w3c/1.2T/svg/animate-elem-24-t.svg)| -|❌|[animate-elem-25-t](SVGViewTests/w3c/1.2T/svg/animate-elem-25-t.svg)| -|❌|[animate-elem-26-t](SVGViewTests/w3c/1.2T/svg/animate-elem-26-t.svg)| -|❌|[animate-elem-27-t](SVGViewTests/w3c/1.2T/svg/animate-elem-27-t.svg)| -|❌|[animate-elem-28-t](SVGViewTests/w3c/1.2T/svg/animate-elem-28-t.svg)| -|❌|[animate-elem-29-t](SVGViewTests/w3c/1.2T/svg/animate-elem-29-t.svg)| -|❌|[animate-elem-30-t](SVGViewTests/w3c/1.2T/svg/animate-elem-30-t.svg)| -|❌|[animate-elem-31-t](SVGViewTests/w3c/1.2T/svg/animate-elem-31-t.svg)| -|❌|[animate-elem-32-t](SVGViewTests/w3c/1.2T/svg/animate-elem-32-t.svg)| -|❌|[animate-elem-33-t](SVGViewTests/w3c/1.2T/svg/animate-elem-33-t.svg)| -|❌|[animate-elem-34-t](SVGViewTests/w3c/1.2T/svg/animate-elem-34-t.svg)| -|❌|[animate-elem-35-t](SVGViewTests/w3c/1.2T/svg/animate-elem-35-t.svg)| -|❌|[animate-elem-36-t](SVGViewTests/w3c/1.2T/svg/animate-elem-36-t.svg)| -|❌|[animate-elem-37-t](SVGViewTests/w3c/1.2T/svg/animate-elem-37-t.svg)| -|❌|[animate-elem-38-t](SVGViewTests/w3c/1.2T/svg/animate-elem-38-t.svg)| -|❌|[animate-elem-39-t](SVGViewTests/w3c/1.2T/svg/animate-elem-39-t.svg)| -|❌|[animate-elem-40-t](SVGViewTests/w3c/1.2T/svg/animate-elem-40-t.svg)| -|❌|[animate-elem-41-t](SVGViewTests/w3c/1.2T/svg/animate-elem-41-t.svg)| -|❌|[animate-elem-44-t](SVGViewTests/w3c/1.2T/svg/animate-elem-44-t.svg)| -|❌|[animate-elem-46-t](SVGViewTests/w3c/1.2T/svg/animate-elem-46-t.svg)| -|❌|[animate-elem-52-t](SVGViewTests/w3c/1.2T/svg/animate-elem-52-t.svg)| -|❌|[animate-elem-53-t](SVGViewTests/w3c/1.2T/svg/animate-elem-53-t.svg)| -|❌|[animate-elem-60-t](SVGViewTests/w3c/1.2T/svg/animate-elem-60-t.svg)| -|❌|[animate-elem-61-t](SVGViewTests/w3c/1.2T/svg/animate-elem-61-t.svg)| -|❌|[animate-elem-62-t](SVGViewTests/w3c/1.2T/svg/animate-elem-62-t.svg)| -|❌|[animate-elem-63-t](SVGViewTests/w3c/1.2T/svg/animate-elem-63-t.svg)| -|❌|[animate-elem-64-t](SVGViewTests/w3c/1.2T/svg/animate-elem-64-t.svg)| -|❌|[animate-elem-65-t](SVGViewTests/w3c/1.2T/svg/animate-elem-65-t.svg)| -|❌|[animate-elem-66-t](SVGViewTests/w3c/1.2T/svg/animate-elem-66-t.svg)| -|❌|[animate-elem-67-t](SVGViewTests/w3c/1.2T/svg/animate-elem-67-t.svg)| -|❌|[animate-elem-68-t](SVGViewTests/w3c/1.2T/svg/animate-elem-68-t.svg)| -|❌|[animate-elem-69-t](SVGViewTests/w3c/1.2T/svg/animate-elem-69-t.svg)| -|❌|[animate-elem-70-t](SVGViewTests/w3c/1.2T/svg/animate-elem-70-t.svg)| -|❌|[animate-elem-77-t](SVGViewTests/w3c/1.2T/svg/animate-elem-77-t.svg)| -|❌|[animate-elem-78-t](SVGViewTests/w3c/1.2T/svg/animate-elem-78-t.svg)| -|❌|[animate-elem-80-t](SVGViewTests/w3c/1.2T/svg/animate-elem-80-t.svg)| -|❌|[animate-elem-81-t](SVGViewTests/w3c/1.2T/svg/animate-elem-81-t.svg)| -|❌|[animate-elem-82-t](SVGViewTests/w3c/1.2T/svg/animate-elem-82-t.svg)| -|❌|[animate-elem-83-t](SVGViewTests/w3c/1.2T/svg/animate-elem-83-t.svg)| -|❌|[animate-elem-84-t](SVGViewTests/w3c/1.2T/svg/animate-elem-84-t.svg)| -|❌|[animate-elem-85-t](SVGViewTests/w3c/1.2T/svg/animate-elem-85-t.svg)| -|❌|[animate-elem-86-t](SVGViewTests/w3c/1.2T/svg/animate-elem-86-t.svg)| +|❌|[animate-elem-02-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-02-t.svg)| +|❌|[animate-elem-03-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-03-t.svg)| +|❌|[animate-elem-04-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-04-t.svg)| +|❌|[animate-elem-05-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-05-t.svg)| +|❌|[animate-elem-06-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-06-t.svg)| +|❌|[animate-elem-07-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-07-t.svg)| +|❌|[animate-elem-08-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-08-t.svg)| +|❌|[animate-elem-09-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-09-t.svg)| +|❌|[animate-elem-10-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-10-t.svg)| +|❌|[animate-elem-11-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-11-t.svg)| +|❌|[animate-elem-12-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-12-t.svg)| +|❌|[animate-elem-13-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-13-t.svg)| +|❌|[animate-elem-14-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-14-t.svg)| +|❌|[animate-elem-15-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-15-t.svg)| +|❌|[animate-elem-17-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-17-t.svg)| +|❌|[animate-elem-19-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-19-t.svg)| +|❌|[animate-elem-20-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-20-t.svg)| +|❌|[animate-elem-201-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-201-t.svg)| +|❌|[animate-elem-202-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-202-t.svg)| +|❌|[animate-elem-203-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-203-t.svg)| +|❌|[animate-elem-204-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-204-t.svg)| +|❌|[animate-elem-205-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-205-t.svg)| +|❌|[animate-elem-206-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-206-t.svg)| +|❌|[animate-elem-207-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-207-t.svg)| +|❌|[animate-elem-208-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-208-t.svg)| +|❌|[animate-elem-209-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-209-t.svg)| +|❌|[animate-elem-21-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-21-t.svg)| +|❌|[animate-elem-210-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-210-t.svg)| +|❌|[animate-elem-211-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-211-t.svg)| +|❌|[animate-elem-212-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-212-t.svg)| +|❌|[animate-elem-213-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-213-t.svg)| +|❌|[animate-elem-214-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-214-t.svg)| +|❌|[animate-elem-215-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-215-t.svg)| +|❌|[animate-elem-216-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-216-t.svg)| +|❌|[animate-elem-217-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-217-t.svg)| +|❌|[animate-elem-218-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-218-t.svg)| +|❌|[animate-elem-219-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-219-t.svg)| +|❌|[animate-elem-22-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-22-t.svg)| +|❌|[animate-elem-220-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-220-t.svg)| +|❌|[animate-elem-221-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-221-t.svg)| +|❌|[animate-elem-222-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-222-t.svg)| +|❌|[animate-elem-223-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-223-t.svg)| +|❌|[animate-elem-224-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-224-t.svg)| +|❌|[animate-elem-225-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-225-t.svg)| +|❌|[animate-elem-226-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-226-t.svg)| +|❌|[animate-elem-227-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-227-t.svg)| +|❌|[animate-elem-23-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-23-t.svg)| +|❌|[animate-elem-24-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-24-t.svg)| +|❌|[animate-elem-25-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-25-t.svg)| +|❌|[animate-elem-26-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-26-t.svg)| +|❌|[animate-elem-27-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-27-t.svg)| +|❌|[animate-elem-28-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-28-t.svg)| +|❌|[animate-elem-29-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-29-t.svg)| +|❌|[animate-elem-30-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-30-t.svg)| +|❌|[animate-elem-31-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-31-t.svg)| +|❌|[animate-elem-32-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-32-t.svg)| +|❌|[animate-elem-33-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-33-t.svg)| +|❌|[animate-elem-34-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-34-t.svg)| +|❌|[animate-elem-35-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-35-t.svg)| +|❌|[animate-elem-36-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-36-t.svg)| +|❌|[animate-elem-37-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-37-t.svg)| +|❌|[animate-elem-38-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-38-t.svg)| +|❌|[animate-elem-39-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-39-t.svg)| +|❌|[animate-elem-40-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-40-t.svg)| +|❌|[animate-elem-41-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-41-t.svg)| +|❌|[animate-elem-44-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-44-t.svg)| +|❌|[animate-elem-46-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-46-t.svg)| +|❌|[animate-elem-52-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-52-t.svg)| +|❌|[animate-elem-53-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-53-t.svg)| +|❌|[animate-elem-60-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-60-t.svg)| +|❌|[animate-elem-61-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-61-t.svg)| +|❌|[animate-elem-62-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-62-t.svg)| +|❌|[animate-elem-63-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-63-t.svg)| +|❌|[animate-elem-64-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-64-t.svg)| +|❌|[animate-elem-65-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-65-t.svg)| +|❌|[animate-elem-66-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-66-t.svg)| +|❌|[animate-elem-67-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-67-t.svg)| +|❌|[animate-elem-68-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-68-t.svg)| +|❌|[animate-elem-69-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-69-t.svg)| +|❌|[animate-elem-70-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-70-t.svg)| +|❌|[animate-elem-77-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-77-t.svg)| +|❌|[animate-elem-78-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-78-t.svg)| +|❌|[animate-elem-80-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-80-t.svg)| +|❌|[animate-elem-81-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-81-t.svg)| +|❌|[animate-elem-82-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-82-t.svg)| +|❌|[animate-elem-83-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-83-t.svg)| +|❌|[animate-elem-84-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-84-t.svg)| +|❌|[animate-elem-85-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-85-t.svg)| +|❌|[animate-elem-86-t](Tests/SVGViewTests/w3c/1.2T/svg/animate-elem-86-t.svg)| ### [Conf](https://www.w3.org/TR/SVGTiny12/conf.html): `0.0%` @@ -892,8 +892,8 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[conf-reader-201-t](SVGViewTests/w3c/1.2T/svg/conf-reader-201-t.svg)| -|❌|[conf-reader-202-t](SVGViewTests/w3c/1.2T/svg/conf-reader-202-t.svg)| +|❌|[conf-reader-201-t](Tests/SVGViewTests/w3c/1.2T/svg/conf-reader-201-t.svg)| +|❌|[conf-reader-202-t](Tests/SVGViewTests/w3c/1.2T/svg/conf-reader-202-t.svg)| ### [Coords](https://www.w3.org/TR/SVGTiny12/coords.html): `50.0%` @@ -903,24 +903,24 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[coords-constr-201-t](SVGViewTests/w3c/1.2T/svg/coords-constr-201-t.svg)| -|❌|[coords-constr-202-t](SVGViewTests/w3c/1.2T/svg/coords-constr-202-t.svg)| -|❌|[coords-constr-203-t](SVGViewTests/w3c/1.2T/svg/coords-constr-203-t.svg)| -|❌|[coords-constr-204-t](SVGViewTests/w3c/1.2T/svg/coords-constr-204-t.svg)| -|❌|[coords-coord-01-t](SVGViewTests/w3c/1.2T/svg/coords-coord-01-t.svg)| -|❌|[coords-pAR-201-t](SVGViewTests/w3c/1.2T/svg/coords-pAR-201-t.svg)| -|✅|[coords-trans-01-t](SVGViewTests/w3c/1.2T/svg/coords-trans-01-t.svg)| -|✅|[coords-trans-02-t](SVGViewTests/w3c/1.2T/svg/coords-trans-02-t.svg)| -|✅|[coords-trans-03-t](SVGViewTests/w3c/1.2T/svg/coords-trans-03-t.svg)| -|✅|[coords-trans-04-t](SVGViewTests/w3c/1.2T/svg/coords-trans-04-t.svg)| -|✅|[coords-trans-05-t](SVGViewTests/w3c/1.2T/svg/coords-trans-05-t.svg)| -|✅|[coords-trans-06-t](SVGViewTests/w3c/1.2T/svg/coords-trans-06-t.svg)| -|✅|[coords-trans-07-t](SVGViewTests/w3c/1.2T/svg/coords-trans-07-t.svg)| -|✅|[coords-trans-08-t](SVGViewTests/w3c/1.2T/svg/coords-trans-08-t.svg)| -|✅|[coords-trans-09-t](SVGViewTests/w3c/1.2T/svg/coords-trans-09-t.svg)| -|❌|[coords-units-01-t](SVGViewTests/w3c/1.2T/svg/coords-units-01-t.svg)| -|❌|[coords-units-201-t](SVGViewTests/w3c/1.2T/svg/coords-units-201-t.svg)| -|❌|[coords-viewattr-05-t](SVGViewTests/w3c/1.2T/svg/coords-viewattr-05-t.svg)| +|❌|[coords-constr-201-t](Tests/SVGViewTests/w3c/1.2T/svg/coords-constr-201-t.svg)| +|❌|[coords-constr-202-t](Tests/SVGViewTests/w3c/1.2T/svg/coords-constr-202-t.svg)| +|❌|[coords-constr-203-t](Tests/SVGViewTests/w3c/1.2T/svg/coords-constr-203-t.svg)| +|❌|[coords-constr-204-t](Tests/SVGViewTests/w3c/1.2T/svg/coords-constr-204-t.svg)| +|❌|[coords-coord-01-t](Tests/SVGViewTests/w3c/1.2T/svg/coords-coord-01-t.svg)| +|❌|[coords-pAR-201-t](Tests/SVGViewTests/w3c/1.2T/svg/coords-pAR-201-t.svg)| +|✅|[coords-trans-01-t](Tests/SVGViewTests/w3c/1.2T/svg/coords-trans-01-t.svg)| +|✅|[coords-trans-02-t](Tests/SVGViewTests/w3c/1.2T/svg/coords-trans-02-t.svg)| +|✅|[coords-trans-03-t](Tests/SVGViewTests/w3c/1.2T/svg/coords-trans-03-t.svg)| +|✅|[coords-trans-04-t](Tests/SVGViewTests/w3c/1.2T/svg/coords-trans-04-t.svg)| +|✅|[coords-trans-05-t](Tests/SVGViewTests/w3c/1.2T/svg/coords-trans-05-t.svg)| +|✅|[coords-trans-06-t](Tests/SVGViewTests/w3c/1.2T/svg/coords-trans-06-t.svg)| +|✅|[coords-trans-07-t](Tests/SVGViewTests/w3c/1.2T/svg/coords-trans-07-t.svg)| +|✅|[coords-trans-08-t](Tests/SVGViewTests/w3c/1.2T/svg/coords-trans-08-t.svg)| +|✅|[coords-trans-09-t](Tests/SVGViewTests/w3c/1.2T/svg/coords-trans-09-t.svg)| +|❌|[coords-units-01-t](Tests/SVGViewTests/w3c/1.2T/svg/coords-units-01-t.svg)| +|❌|[coords-units-201-t](Tests/SVGViewTests/w3c/1.2T/svg/coords-units-201-t.svg)| +|❌|[coords-viewattr-05-t](Tests/SVGViewTests/w3c/1.2T/svg/coords-viewattr-05-t.svg)| ### [Extend](https://www.w3.org/TR/SVGTiny12/extend.html): `0.0%` @@ -930,7 +930,7 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[extend-namespace-02-t](SVGViewTests/w3c/1.2T/svg/extend-namespace-02-t.svg)| +|❌|[extend-namespace-02-t](Tests/SVGViewTests/w3c/1.2T/svg/extend-namespace-02-t.svg)| ### [Fonts](https://www.w3.org/TR/SVGTiny12/fonts.html): `0.0%` @@ -940,23 +940,23 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[fonts-desc-02-t](SVGViewTests/w3c/1.2T/svg/fonts-desc-02-t.svg)| -|❌|[fonts-desc-03-t](SVGViewTests/w3c/1.2T/svg/fonts-desc-03-t.svg)| -|❌|[fonts-desc-05-t](SVGViewTests/w3c/1.2T/svg/fonts-desc-05-t.svg)| -|❌|[fonts-elem-01-t](SVGViewTests/w3c/1.2T/svg/fonts-elem-01-t.svg)| -|❌|[fonts-elem-02-t](SVGViewTests/w3c/1.2T/svg/fonts-elem-02-t.svg)| -|❌|[fonts-elem-03-t](SVGViewTests/w3c/1.2T/svg/fonts-elem-03-t.svg)| -|❌|[fonts-elem-05-t](SVGViewTests/w3c/1.2T/svg/fonts-elem-05-t.svg)| -|❌|[fonts-elem-06-t](SVGViewTests/w3c/1.2T/svg/fonts-elem-06-t.svg)| -|❌|[fonts-elem-201-t](SVGViewTests/w3c/1.2T/svg/fonts-elem-201-t.svg)| -|❌|[fonts-glyph-02-t](SVGViewTests/w3c/1.2T/svg/fonts-glyph-02-t.svg)| -|❌|[fonts-glyph-03-t](SVGViewTests/w3c/1.2T/svg/fonts-glyph-03-t.svg)| -|❌|[fonts-glyph-04-t](SVGViewTests/w3c/1.2T/svg/fonts-glyph-04-t.svg)| -|❌|[fonts-glyph-201-t](SVGViewTests/w3c/1.2T/svg/fonts-glyph-201-t.svg)| -|❌|[fonts-glyph-202-t](SVGViewTests/w3c/1.2T/svg/fonts-glyph-202-t.svg)| -|❌|[fonts-glyph-203-t](SVGViewTests/w3c/1.2T/svg/fonts-glyph-203-t.svg)| -|❌|[fonts-kern-01-t](SVGViewTests/w3c/1.2T/svg/fonts-kern-01-t.svg)| -|❌|[fonts-overview-201-t](SVGViewTests/w3c/1.2T/svg/fonts-overview-201-t.svg)| +|❌|[fonts-desc-02-t](Tests/SVGViewTests/w3c/1.2T/svg/fonts-desc-02-t.svg)| +|❌|[fonts-desc-03-t](Tests/SVGViewTests/w3c/1.2T/svg/fonts-desc-03-t.svg)| +|❌|[fonts-desc-05-t](Tests/SVGViewTests/w3c/1.2T/svg/fonts-desc-05-t.svg)| +|❌|[fonts-elem-01-t](Tests/SVGViewTests/w3c/1.2T/svg/fonts-elem-01-t.svg)| +|❌|[fonts-elem-02-t](Tests/SVGViewTests/w3c/1.2T/svg/fonts-elem-02-t.svg)| +|❌|[fonts-elem-03-t](Tests/SVGViewTests/w3c/1.2T/svg/fonts-elem-03-t.svg)| +|❌|[fonts-elem-05-t](Tests/SVGViewTests/w3c/1.2T/svg/fonts-elem-05-t.svg)| +|❌|[fonts-elem-06-t](Tests/SVGViewTests/w3c/1.2T/svg/fonts-elem-06-t.svg)| +|❌|[fonts-elem-201-t](Tests/SVGViewTests/w3c/1.2T/svg/fonts-elem-201-t.svg)| +|❌|[fonts-glyph-02-t](Tests/SVGViewTests/w3c/1.2T/svg/fonts-glyph-02-t.svg)| +|❌|[fonts-glyph-03-t](Tests/SVGViewTests/w3c/1.2T/svg/fonts-glyph-03-t.svg)| +|❌|[fonts-glyph-04-t](Tests/SVGViewTests/w3c/1.2T/svg/fonts-glyph-04-t.svg)| +|❌|[fonts-glyph-201-t](Tests/SVGViewTests/w3c/1.2T/svg/fonts-glyph-201-t.svg)| +|❌|[fonts-glyph-202-t](Tests/SVGViewTests/w3c/1.2T/svg/fonts-glyph-202-t.svg)| +|❌|[fonts-glyph-203-t](Tests/SVGViewTests/w3c/1.2T/svg/fonts-glyph-203-t.svg)| +|❌|[fonts-kern-01-t](Tests/SVGViewTests/w3c/1.2T/svg/fonts-kern-01-t.svg)| +|❌|[fonts-overview-201-t](Tests/SVGViewTests/w3c/1.2T/svg/fonts-overview-201-t.svg)| ### [Interact](https://www.w3.org/TR/SVGTiny12/interact.html): `0.0%` @@ -966,35 +966,35 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[interact-dom-02-t](SVGViewTests/w3c/1.2T/svg/interact-dom-02-t.svg)| -|❌|[interact-event-201-t](SVGViewTests/w3c/1.2T/svg/interact-event-201-t.svg)| -|❌|[interact-event-202-t](SVGViewTests/w3c/1.2T/svg/interact-event-202-t.svg)| -|❌|[interact-event-203-t](SVGViewTests/w3c/1.2T/svg/interact-event-203-t.svg)| -|❌|[interact-event-204-t](SVGViewTests/w3c/1.2T/svg/interact-event-204-t.svg)| -|❌|[interact-focus-201-t](SVGViewTests/w3c/1.2T/svg/interact-focus-201-t.svg)| -|❌|[interact-focus-202-t](SVGViewTests/w3c/1.2T/svg/interact-focus-202-t.svg)| -|❌|[interact-focus-203-t](SVGViewTests/w3c/1.2T/svg/interact-focus-203-t.svg)| -|❌|[interact-focus-204-t](SVGViewTests/w3c/1.2T/svg/interact-focus-204-t.svg)| -|❌|[interact-focus-205-t](SVGViewTests/w3c/1.2T/svg/interact-focus-205-t.svg)| -|❌|[interact-focus-206-t](SVGViewTests/w3c/1.2T/svg/interact-focus-206-t.svg)| -|❌|[interact-focus-207-t](SVGViewTests/w3c/1.2T/svg/interact-focus-207-t.svg)| -|❌|[interact-focus-208-t](SVGViewTests/w3c/1.2T/svg/interact-focus-208-t.svg)| -|❌|[interact-focus-209-t](SVGViewTests/w3c/1.2T/svg/interact-focus-209-t.svg)| -|❌|[interact-focus-210-t](SVGViewTests/w3c/1.2T/svg/interact-focus-210-t.svg)| -|❌|[interact-focus-211-t](SVGViewTests/w3c/1.2T/svg/interact-focus-211-t.svg)| -|❌|[interact-focus-212-t](SVGViewTests/w3c/1.2T/svg/interact-focus-212-t.svg)| -|❌|[interact-order-04-t](SVGViewTests/w3c/1.2T/svg/interact-order-04-t.svg)| -|❌|[interact-order-05-t](SVGViewTests/w3c/1.2T/svg/interact-order-05-t.svg)| -|❌|[interact-order-06-t](SVGViewTests/w3c/1.2T/svg/interact-order-06-t.svg)| -|❌|[interact-pevents-01-t](SVGViewTests/w3c/1.2T/svg/interact-pevents-01-t.svg)| -|❌|[interact-pevents-02-t](SVGViewTests/w3c/1.2T/svg/interact-pevents-02-t.svg)| -|❌|[interact-pevents-05-t](SVGViewTests/w3c/1.2T/svg/interact-pevents-05-t.svg)| -|❌|[interact-pevents-06-t](SVGViewTests/w3c/1.2T/svg/interact-pevents-06-t.svg)| -|❌|[interact-pevents-07-t](SVGViewTests/w3c/1.2T/svg/interact-pevents-07-t.svg)| -|❌|[interact-pevents-08-t](SVGViewTests/w3c/1.2T/svg/interact-pevents-08-t.svg)| -|❌|[interact-zoom-01-t](SVGViewTests/w3c/1.2T/svg/interact-zoom-01-t.svg)| -|❌|[interact-zoom-02-t](SVGViewTests/w3c/1.2T/svg/interact-zoom-02-t.svg)| -|❌|[interact-zoom-03-t](SVGViewTests/w3c/1.2T/svg/interact-zoom-03-t.svg)| +|❌|[interact-dom-02-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-dom-02-t.svg)| +|❌|[interact-event-201-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-event-201-t.svg)| +|❌|[interact-event-202-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-event-202-t.svg)| +|❌|[interact-event-203-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-event-203-t.svg)| +|❌|[interact-event-204-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-event-204-t.svg)| +|❌|[interact-focus-201-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-focus-201-t.svg)| +|❌|[interact-focus-202-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-focus-202-t.svg)| +|❌|[interact-focus-203-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-focus-203-t.svg)| +|❌|[interact-focus-204-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-focus-204-t.svg)| +|❌|[interact-focus-205-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-focus-205-t.svg)| +|❌|[interact-focus-206-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-focus-206-t.svg)| +|❌|[interact-focus-207-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-focus-207-t.svg)| +|❌|[interact-focus-208-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-focus-208-t.svg)| +|❌|[interact-focus-209-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-focus-209-t.svg)| +|❌|[interact-focus-210-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-focus-210-t.svg)| +|❌|[interact-focus-211-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-focus-211-t.svg)| +|❌|[interact-focus-212-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-focus-212-t.svg)| +|❌|[interact-order-04-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-order-04-t.svg)| +|❌|[interact-order-05-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-order-05-t.svg)| +|❌|[interact-order-06-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-order-06-t.svg)| +|❌|[interact-pevents-01-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-pevents-01-t.svg)| +|❌|[interact-pevents-02-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-pevents-02-t.svg)| +|❌|[interact-pevents-05-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-pevents-05-t.svg)| +|❌|[interact-pevents-06-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-pevents-06-t.svg)| +|❌|[interact-pevents-07-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-pevents-07-t.svg)| +|❌|[interact-pevents-08-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-pevents-08-t.svg)| +|❌|[interact-zoom-01-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-zoom-01-t.svg)| +|❌|[interact-zoom-02-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-zoom-02-t.svg)| +|❌|[interact-zoom-03-t](Tests/SVGViewTests/w3c/1.2T/svg/interact-zoom-03-t.svg)| ### [Intro](https://www.w3.org/TR/SVGTiny12/intro.html): `0.0%` @@ -1004,7 +1004,7 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[intro-compat-201-t](SVGViewTests/w3c/1.2T/svg/intro-compat-201-t.svg)| +|❌|[intro-compat-201-t](Tests/SVGViewTests/w3c/1.2T/svg/intro-compat-201-t.svg)| ### [Jpeg](https://www.w3.org/TR/SVGTiny12/jpeg.html): `0.0%` @@ -1014,16 +1014,16 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[jpeg-required-201-t](SVGViewTests/w3c/1.2T/svg/jpeg-required-201-t.svg)| -|❌|[jpeg-required-202-t](SVGViewTests/w3c/1.2T/svg/jpeg-required-202-t.svg)| -|❌|[jpeg-required-203-t](SVGViewTests/w3c/1.2T/svg/jpeg-required-203-t.svg)| -|❌|[jpeg-required-204-t](SVGViewTests/w3c/1.2T/svg/jpeg-required-204-t.svg)| -|❌|[jpeg-required-205-t](SVGViewTests/w3c/1.2T/svg/jpeg-required-205-t.svg)| -|❌|[jpeg-required-206-t](SVGViewTests/w3c/1.2T/svg/jpeg-required-206-t.svg)| -|❌|[jpeg-required-207-t](SVGViewTests/w3c/1.2T/svg/jpeg-required-207-t.svg)| -|❌|[jpeg-required-208-t](SVGViewTests/w3c/1.2T/svg/jpeg-required-208-t.svg)| -|❌|[jpeg-required-209-t](SVGViewTests/w3c/1.2T/svg/jpeg-required-209-t.svg)| -|❌|[jpeg-required-210-t](SVGViewTests/w3c/1.2T/svg/jpeg-required-210-t.svg)| +|❌|[jpeg-required-201-t](Tests/SVGViewTests/w3c/1.2T/svg/jpeg-required-201-t.svg)| +|❌|[jpeg-required-202-t](Tests/SVGViewTests/w3c/1.2T/svg/jpeg-required-202-t.svg)| +|❌|[jpeg-required-203-t](Tests/SVGViewTests/w3c/1.2T/svg/jpeg-required-203-t.svg)| +|❌|[jpeg-required-204-t](Tests/SVGViewTests/w3c/1.2T/svg/jpeg-required-204-t.svg)| +|❌|[jpeg-required-205-t](Tests/SVGViewTests/w3c/1.2T/svg/jpeg-required-205-t.svg)| +|❌|[jpeg-required-206-t](Tests/SVGViewTests/w3c/1.2T/svg/jpeg-required-206-t.svg)| +|❌|[jpeg-required-207-t](Tests/SVGViewTests/w3c/1.2T/svg/jpeg-required-207-t.svg)| +|❌|[jpeg-required-208-t](Tests/SVGViewTests/w3c/1.2T/svg/jpeg-required-208-t.svg)| +|❌|[jpeg-required-209-t](Tests/SVGViewTests/w3c/1.2T/svg/jpeg-required-209-t.svg)| +|❌|[jpeg-required-210-t](Tests/SVGViewTests/w3c/1.2T/svg/jpeg-required-210-t.svg)| ### [Linking](https://www.w3.org/TR/SVGTiny12/linking.html): `0.0%` @@ -1033,24 +1033,24 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[linking-a-03-t](SVGViewTests/w3c/1.2T/svg/linking-a-03-t.svg)| -|❌|[linking-a-08-t](SVGViewTests/w3c/1.2T/svg/linking-a-08-t.svg)| -|❌|[linking-a-09-t](SVGViewTests/w3c/1.2T/svg/linking-a-09-t.svg)| -|❌|[linking-a-201-t](SVGViewTests/w3c/1.2T/svg/linking-a-201-t.svg)| -|❌|[linking-a-202-t](SVGViewTests/w3c/1.2T/svg/linking-a-202-t.svg)| -|❌|[linking-a-203-t](SVGViewTests/w3c/1.2T/svg/linking-a-203-t.svg)| -|❌|[linking-frag-201-t](SVGViewTests/w3c/1.2T/svg/linking-frag-201-t.svg)| -|❌|[linking-frag-202-t](SVGViewTests/w3c/1.2T/svg/linking-frag-202-t.svg)| -|❌|[linking-frag-203-t](SVGViewTests/w3c/1.2T/svg/linking-frag-203-t.svg)| -|❌|[linking-frag-204-t](SVGViewTests/w3c/1.2T/svg/linking-frag-204-t.svg)| -|❌|[linking-refs-201-t](SVGViewTests/w3c/1.2T/svg/linking-refs-201-t.svg)| -|❌|[linking-refs-202-t](SVGViewTests/w3c/1.2T/svg/linking-refs-202-t.svg)| -|❌|[linking-refs-203-t](SVGViewTests/w3c/1.2T/svg/linking-refs-203-t.svg)| -|❌|[linking-refs-204-t](SVGViewTests/w3c/1.2T/svg/linking-refs-204-t.svg)| -|❌|[linking-refs-205-t](SVGViewTests/w3c/1.2T/svg/linking-refs-205-t.svg)| -|❌|[linking-refs-206-t](SVGViewTests/w3c/1.2T/svg/linking-refs-206-t.svg)| -|❌|[linking-refs-207-t](SVGViewTests/w3c/1.2T/svg/linking-refs-207-t.svg)| -|❌|[linking-uri-03-t](SVGViewTests/w3c/1.2T/svg/linking-uri-03-t.svg)| +|❌|[linking-a-03-t](Tests/SVGViewTests/w3c/1.2T/svg/linking-a-03-t.svg)| +|❌|[linking-a-08-t](Tests/SVGViewTests/w3c/1.2T/svg/linking-a-08-t.svg)| +|❌|[linking-a-09-t](Tests/SVGViewTests/w3c/1.2T/svg/linking-a-09-t.svg)| +|❌|[linking-a-201-t](Tests/SVGViewTests/w3c/1.2T/svg/linking-a-201-t.svg)| +|❌|[linking-a-202-t](Tests/SVGViewTests/w3c/1.2T/svg/linking-a-202-t.svg)| +|❌|[linking-a-203-t](Tests/SVGViewTests/w3c/1.2T/svg/linking-a-203-t.svg)| +|❌|[linking-frag-201-t](Tests/SVGViewTests/w3c/1.2T/svg/linking-frag-201-t.svg)| +|❌|[linking-frag-202-t](Tests/SVGViewTests/w3c/1.2T/svg/linking-frag-202-t.svg)| +|❌|[linking-frag-203-t](Tests/SVGViewTests/w3c/1.2T/svg/linking-frag-203-t.svg)| +|❌|[linking-frag-204-t](Tests/SVGViewTests/w3c/1.2T/svg/linking-frag-204-t.svg)| +|❌|[linking-refs-201-t](Tests/SVGViewTests/w3c/1.2T/svg/linking-refs-201-t.svg)| +|❌|[linking-refs-202-t](Tests/SVGViewTests/w3c/1.2T/svg/linking-refs-202-t.svg)| +|❌|[linking-refs-203-t](Tests/SVGViewTests/w3c/1.2T/svg/linking-refs-203-t.svg)| +|❌|[linking-refs-204-t](Tests/SVGViewTests/w3c/1.2T/svg/linking-refs-204-t.svg)| +|❌|[linking-refs-205-t](Tests/SVGViewTests/w3c/1.2T/svg/linking-refs-205-t.svg)| +|❌|[linking-refs-206-t](Tests/SVGViewTests/w3c/1.2T/svg/linking-refs-206-t.svg)| +|❌|[linking-refs-207-t](Tests/SVGViewTests/w3c/1.2T/svg/linking-refs-207-t.svg)| +|❌|[linking-uri-03-t](Tests/SVGViewTests/w3c/1.2T/svg/linking-uri-03-t.svg)| ### [Media](https://www.w3.org/TR/SVGTiny12/media.html): `0.0%` @@ -1060,69 +1060,69 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[media-alevel-201-t](SVGViewTests/w3c/1.2T/svg/media-alevel-201-t.svg)| -|❌|[media-alevel-202-t](SVGViewTests/w3c/1.2T/svg/media-alevel-202-t.svg)| -|❌|[media-alevel-203-t](SVGViewTests/w3c/1.2T/svg/media-alevel-203-t.svg)| -|❌|[media-alevel-204-t](SVGViewTests/w3c/1.2T/svg/media-alevel-204-t.svg)| -|❌|[media-alevel-205-t](SVGViewTests/w3c/1.2T/svg/media-alevel-205-t.svg)| -|❌|[media-alevel-206-t](SVGViewTests/w3c/1.2T/svg/media-alevel-206-t.svg)| -|❌|[media-alevel-207-t](SVGViewTests/w3c/1.2T/svg/media-alevel-207-t.svg)| -|❌|[media-alevel-208-t](SVGViewTests/w3c/1.2T/svg/media-alevel-208-t.svg)| -|❌|[media-anim-201-t](SVGViewTests/w3c/1.2T/svg/media-anim-201-t.svg)| -|❌|[media-anim-202-t](SVGViewTests/w3c/1.2T/svg/media-anim-202-t.svg)| -|❌|[media-anim-203-t](SVGViewTests/w3c/1.2T/svg/media-anim-203-t.svg)| -|❌|[media-anim-204-t](SVGViewTests/w3c/1.2T/svg/media-anim-204-t.svg)| -|❌|[media-anim-205-t](SVGViewTests/w3c/1.2T/svg/media-anim-205-t.svg)| -|❌|[media-anim-206-t](SVGViewTests/w3c/1.2T/svg/media-anim-206-t.svg)| -|❌|[media-anim-207-t](SVGViewTests/w3c/1.2T/svg/media-anim-207-t.svg)| -|❌|[media-anim-208-t](SVGViewTests/w3c/1.2T/svg/media-anim-208-t.svg)| -|❌|[media-anim-209-t](SVGViewTests/w3c/1.2T/svg/media-anim-209-t.svg)| -|❌|[media-anim-210-t](SVGViewTests/w3c/1.2T/svg/media-anim-210-t.svg)| -|❌|[media-anim-211-t](SVGViewTests/w3c/1.2T/svg/media-anim-211-t.svg)| -|❌|[media-anim-212-t](SVGViewTests/w3c/1.2T/svg/media-anim-212-t.svg)| -|❌|[media-anim-213-t](SVGViewTests/w3c/1.2T/svg/media-anim-213-t.svg)| -|❌|[media-audio-201-t](SVGViewTests/w3c/1.2T/svg/media-audio-201-t.svg)| -|❌|[media-audio-202-t](SVGViewTests/w3c/1.2T/svg/media-audio-202-t.svg)| -|❌|[media-audio-203-t](SVGViewTests/w3c/1.2T/svg/media-audio-203-t.svg)| -|❌|[media-audio-204-t](SVGViewTests/w3c/1.2T/svg/media-audio-204-t.svg)| -|❌|[media-audio-205-t](SVGViewTests/w3c/1.2T/svg/media-audio-205-t.svg)| -|❌|[media-audio-206-t](SVGViewTests/w3c/1.2T/svg/media-audio-206-t.svg)| -|❌|[media-audio-207-t](SVGViewTests/w3c/1.2T/svg/media-audio-207-t.svg)| -|❌|[media-audio-208-t](SVGViewTests/w3c/1.2T/svg/media-audio-208-t.svg)| -|❌|[media-audio-209-t](SVGViewTests/w3c/1.2T/svg/media-audio-209-t.svg)| -|❌|[media-audio-210-t](SVGViewTests/w3c/1.2T/svg/media-audio-210-t.svg)| -|❌|[media-audio-211-t](SVGViewTests/w3c/1.2T/svg/media-audio-211-t.svg)| -|❌|[media-audio-212-t](SVGViewTests/w3c/1.2T/svg/media-audio-212-t.svg)| -|❌|[media-audio-213-t](SVGViewTests/w3c/1.2T/svg/media-audio-213-t.svg)| -|❌|[media-audio-214-t](SVGViewTests/w3c/1.2T/svg/media-audio-214-t.svg)| -|❌|[media-audio-215-t](SVGViewTests/w3c/1.2T/svg/media-audio-215-t.svg)| -|❌|[media-audio-216-t](SVGViewTests/w3c/1.2T/svg/media-audio-216-t.svg)| -|❌|[media-audio-217-t](SVGViewTests/w3c/1.2T/svg/media-audio-217-t.svg)| -|❌|[media-sync-201-t](SVGViewTests/w3c/1.2T/svg/media-sync-201-t.svg)| -|❌|[media-video-201-t](SVGViewTests/w3c/1.2T/svg/media-video-201-t.svg)| -|❌|[media-video-202-t](SVGViewTests/w3c/1.2T/svg/media-video-202-t.svg)| -|❌|[media-video-203-t](SVGViewTests/w3c/1.2T/svg/media-video-203-t.svg)| -|❌|[media-video-204-t](SVGViewTests/w3c/1.2T/svg/media-video-204-t.svg)| -|❌|[media-video-205-t](SVGViewTests/w3c/1.2T/svg/media-video-205-t.svg)| -|❌|[media-video-206-t](SVGViewTests/w3c/1.2T/svg/media-video-206-t.svg)| -|❌|[media-video-207-t](SVGViewTests/w3c/1.2T/svg/media-video-207-t.svg)| -|❌|[media-video-208-t](SVGViewTests/w3c/1.2T/svg/media-video-208-t.svg)| -|❌|[media-video-209-t](SVGViewTests/w3c/1.2T/svg/media-video-209-t.svg)| -|❌|[media-video-210-t](SVGViewTests/w3c/1.2T/svg/media-video-210-t.svg)| -|❌|[media-video-211-t](SVGViewTests/w3c/1.2T/svg/media-video-211-t.svg)| -|❌|[media-video-212-t](SVGViewTests/w3c/1.2T/svg/media-video-212-t.svg)| -|❌|[media-video-213-t](SVGViewTests/w3c/1.2T/svg/media-video-213-t.svg)| -|❌|[media-video-214-t](SVGViewTests/w3c/1.2T/svg/media-video-214-t.svg)| -|❌|[media-video-215-t](SVGViewTests/w3c/1.2T/svg/media-video-215-t.svg)| -|❌|[media-video-216-t](SVGViewTests/w3c/1.2T/svg/media-video-216-t.svg)| -|❌|[media-video-217-t](SVGViewTests/w3c/1.2T/svg/media-video-217-t.svg)| -|❌|[media-video-218-t](SVGViewTests/w3c/1.2T/svg/media-video-218-t.svg)| -|❌|[media-video-219-t](SVGViewTests/w3c/1.2T/svg/media-video-219-t.svg)| -|❌|[media-video-220-t](SVGViewTests/w3c/1.2T/svg/media-video-220-t.svg)| -|❌|[media-video-221-t](SVGViewTests/w3c/1.2T/svg/media-video-221-t.svg)| -|❌|[media-video-222-t](SVGViewTests/w3c/1.2T/svg/media-video-222-t.svg)| -|❌|[media-video-223-t](SVGViewTests/w3c/1.2T/svg/media-video-223-t.svg)| -|❌|[media-video-224-t](SVGViewTests/w3c/1.2T/svg/media-video-224-t.svg)| +|❌|[media-alevel-201-t](Tests/SVGViewTests/w3c/1.2T/svg/media-alevel-201-t.svg)| +|❌|[media-alevel-202-t](Tests/SVGViewTests/w3c/1.2T/svg/media-alevel-202-t.svg)| +|❌|[media-alevel-203-t](Tests/SVGViewTests/w3c/1.2T/svg/media-alevel-203-t.svg)| +|❌|[media-alevel-204-t](Tests/SVGViewTests/w3c/1.2T/svg/media-alevel-204-t.svg)| +|❌|[media-alevel-205-t](Tests/SVGViewTests/w3c/1.2T/svg/media-alevel-205-t.svg)| +|❌|[media-alevel-206-t](Tests/SVGViewTests/w3c/1.2T/svg/media-alevel-206-t.svg)| +|❌|[media-alevel-207-t](Tests/SVGViewTests/w3c/1.2T/svg/media-alevel-207-t.svg)| +|❌|[media-alevel-208-t](Tests/SVGViewTests/w3c/1.2T/svg/media-alevel-208-t.svg)| +|❌|[media-anim-201-t](Tests/SVGViewTests/w3c/1.2T/svg/media-anim-201-t.svg)| +|❌|[media-anim-202-t](Tests/SVGViewTests/w3c/1.2T/svg/media-anim-202-t.svg)| +|❌|[media-anim-203-t](Tests/SVGViewTests/w3c/1.2T/svg/media-anim-203-t.svg)| +|❌|[media-anim-204-t](Tests/SVGViewTests/w3c/1.2T/svg/media-anim-204-t.svg)| +|❌|[media-anim-205-t](Tests/SVGViewTests/w3c/1.2T/svg/media-anim-205-t.svg)| +|❌|[media-anim-206-t](Tests/SVGViewTests/w3c/1.2T/svg/media-anim-206-t.svg)| +|❌|[media-anim-207-t](Tests/SVGViewTests/w3c/1.2T/svg/media-anim-207-t.svg)| +|❌|[media-anim-208-t](Tests/SVGViewTests/w3c/1.2T/svg/media-anim-208-t.svg)| +|❌|[media-anim-209-t](Tests/SVGViewTests/w3c/1.2T/svg/media-anim-209-t.svg)| +|❌|[media-anim-210-t](Tests/SVGViewTests/w3c/1.2T/svg/media-anim-210-t.svg)| +|❌|[media-anim-211-t](Tests/SVGViewTests/w3c/1.2T/svg/media-anim-211-t.svg)| +|❌|[media-anim-212-t](Tests/SVGViewTests/w3c/1.2T/svg/media-anim-212-t.svg)| +|❌|[media-anim-213-t](Tests/SVGViewTests/w3c/1.2T/svg/media-anim-213-t.svg)| +|❌|[media-audio-201-t](Tests/SVGViewTests/w3c/1.2T/svg/media-audio-201-t.svg)| +|❌|[media-audio-202-t](Tests/SVGViewTests/w3c/1.2T/svg/media-audio-202-t.svg)| +|❌|[media-audio-203-t](Tests/SVGViewTests/w3c/1.2T/svg/media-audio-203-t.svg)| +|❌|[media-audio-204-t](Tests/SVGViewTests/w3c/1.2T/svg/media-audio-204-t.svg)| +|❌|[media-audio-205-t](Tests/SVGViewTests/w3c/1.2T/svg/media-audio-205-t.svg)| +|❌|[media-audio-206-t](Tests/SVGViewTests/w3c/1.2T/svg/media-audio-206-t.svg)| +|❌|[media-audio-207-t](Tests/SVGViewTests/w3c/1.2T/svg/media-audio-207-t.svg)| +|❌|[media-audio-208-t](Tests/SVGViewTests/w3c/1.2T/svg/media-audio-208-t.svg)| +|❌|[media-audio-209-t](Tests/SVGViewTests/w3c/1.2T/svg/media-audio-209-t.svg)| +|❌|[media-audio-210-t](Tests/SVGViewTests/w3c/1.2T/svg/media-audio-210-t.svg)| +|❌|[media-audio-211-t](Tests/SVGViewTests/w3c/1.2T/svg/media-audio-211-t.svg)| +|❌|[media-audio-212-t](Tests/SVGViewTests/w3c/1.2T/svg/media-audio-212-t.svg)| +|❌|[media-audio-213-t](Tests/SVGViewTests/w3c/1.2T/svg/media-audio-213-t.svg)| +|❌|[media-audio-214-t](Tests/SVGViewTests/w3c/1.2T/svg/media-audio-214-t.svg)| +|❌|[media-audio-215-t](Tests/SVGViewTests/w3c/1.2T/svg/media-audio-215-t.svg)| +|❌|[media-audio-216-t](Tests/SVGViewTests/w3c/1.2T/svg/media-audio-216-t.svg)| +|❌|[media-audio-217-t](Tests/SVGViewTests/w3c/1.2T/svg/media-audio-217-t.svg)| +|❌|[media-sync-201-t](Tests/SVGViewTests/w3c/1.2T/svg/media-sync-201-t.svg)| +|❌|[media-video-201-t](Tests/SVGViewTests/w3c/1.2T/svg/media-video-201-t.svg)| +|❌|[media-video-202-t](Tests/SVGViewTests/w3c/1.2T/svg/media-video-202-t.svg)| +|❌|[media-video-203-t](Tests/SVGViewTests/w3c/1.2T/svg/media-video-203-t.svg)| +|❌|[media-video-204-t](Tests/SVGViewTests/w3c/1.2T/svg/media-video-204-t.svg)| +|❌|[media-video-205-t](Tests/SVGViewTests/w3c/1.2T/svg/media-video-205-t.svg)| +|❌|[media-video-206-t](Tests/SVGViewTests/w3c/1.2T/svg/media-video-206-t.svg)| +|❌|[media-video-207-t](Tests/SVGViewTests/w3c/1.2T/svg/media-video-207-t.svg)| +|❌|[media-video-208-t](Tests/SVGViewTests/w3c/1.2T/svg/media-video-208-t.svg)| +|❌|[media-video-209-t](Tests/SVGViewTests/w3c/1.2T/svg/media-video-209-t.svg)| +|❌|[media-video-210-t](Tests/SVGViewTests/w3c/1.2T/svg/media-video-210-t.svg)| +|❌|[media-video-211-t](Tests/SVGViewTests/w3c/1.2T/svg/media-video-211-t.svg)| +|❌|[media-video-212-t](Tests/SVGViewTests/w3c/1.2T/svg/media-video-212-t.svg)| +|❌|[media-video-213-t](Tests/SVGViewTests/w3c/1.2T/svg/media-video-213-t.svg)| +|❌|[media-video-214-t](Tests/SVGViewTests/w3c/1.2T/svg/media-video-214-t.svg)| +|❌|[media-video-215-t](Tests/SVGViewTests/w3c/1.2T/svg/media-video-215-t.svg)| +|❌|[media-video-216-t](Tests/SVGViewTests/w3c/1.2T/svg/media-video-216-t.svg)| +|❌|[media-video-217-t](Tests/SVGViewTests/w3c/1.2T/svg/media-video-217-t.svg)| +|❌|[media-video-218-t](Tests/SVGViewTests/w3c/1.2T/svg/media-video-218-t.svg)| +|❌|[media-video-219-t](Tests/SVGViewTests/w3c/1.2T/svg/media-video-219-t.svg)| +|❌|[media-video-220-t](Tests/SVGViewTests/w3c/1.2T/svg/media-video-220-t.svg)| +|❌|[media-video-221-t](Tests/SVGViewTests/w3c/1.2T/svg/media-video-221-t.svg)| +|❌|[media-video-222-t](Tests/SVGViewTests/w3c/1.2T/svg/media-video-222-t.svg)| +|❌|[media-video-223-t](Tests/SVGViewTests/w3c/1.2T/svg/media-video-223-t.svg)| +|❌|[media-video-224-t](Tests/SVGViewTests/w3c/1.2T/svg/media-video-224-t.svg)| ### [Metadata](https://www.w3.org/TR/SVGTiny12/metadata.html): `0.0%` @@ -1132,7 +1132,7 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[metadata-example-01-t](SVGViewTests/w3c/1.2T/svg/metadata-example-01-t.svg)| +|❌|[metadata-example-01-t](Tests/SVGViewTests/w3c/1.2T/svg/metadata-example-01-t.svg)| ### [Paint](https://www.w3.org/TR/SVGTiny12/paint.html): `9.0%` @@ -1142,61 +1142,61 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[paint-color-01-t](SVGViewTests/w3c/1.2T/svg/paint-color-01-t.svg)| -|✅|[paint-color-03-t](SVGViewTests/w3c/1.2T/svg/paint-color-03-t.svg)| -|❌|[paint-color-04-t](SVGViewTests/w3c/1.2T/svg/paint-color-04-t.svg)| -|❌|[paint-color-05-t](SVGViewTests/w3c/1.2T/svg/paint-color-05-t.svg)| -|✅|[paint-color-201-t](SVGViewTests/w3c/1.2T/svg/paint-color-201-t.svg)| -|❌|[paint-fill-01-t](SVGViewTests/w3c/1.2T/svg/paint-fill-01-t.svg)| -|❌|[paint-fill-02-t](SVGViewTests/w3c/1.2T/svg/paint-fill-02-t.svg)| -|❌|[paint-fill-03-t](SVGViewTests/w3c/1.2T/svg/paint-fill-03-t.svg)| -|✅|[paint-fill-04-t](SVGViewTests/w3c/1.2T/svg/paint-fill-04-t.svg)| -|❌|[paint-fill-05-t](SVGViewTests/w3c/1.2T/svg/paint-fill-05-t.svg)| -|✅|[paint-fill-06-t](SVGViewTests/w3c/1.2T/svg/paint-fill-06-t.svg)| -|❌|[paint-grad-04-t](SVGViewTests/w3c/1.2T/svg/paint-grad-04-t.svg)| -|❌|[paint-grad-05-t](SVGViewTests/w3c/1.2T/svg/paint-grad-05-t.svg)| -|❌|[paint-grad-07-t](SVGViewTests/w3c/1.2T/svg/paint-grad-07-t.svg)| -|❌|[paint-grad-08-t](SVGViewTests/w3c/1.2T/svg/paint-grad-08-t.svg)| -|❌|[paint-grad-09-t](SVGViewTests/w3c/1.2T/svg/paint-grad-09-t.svg)| -|❌|[paint-grad-11-t](SVGViewTests/w3c/1.2T/svg/paint-grad-11-t.svg)| -|❌|[paint-grad-12-t](SVGViewTests/w3c/1.2T/svg/paint-grad-12-t.svg)| -|❌|[paint-grad-15-t](SVGViewTests/w3c/1.2T/svg/paint-grad-15-t.svg)| -|❌|[paint-grad-16-t](SVGViewTests/w3c/1.2T/svg/paint-grad-16-t.svg)| -|❌|[paint-grad-17-t](SVGViewTests/w3c/1.2T/svg/paint-grad-17-t.svg)| -|❌|[paint-grad-18-t](SVGViewTests/w3c/1.2T/svg/paint-grad-18-t.svg)| -|❌|[paint-grad-19-t](SVGViewTests/w3c/1.2T/svg/paint-grad-19-t.svg)| -|❌|[paint-grad-201-t](SVGViewTests/w3c/1.2T/svg/paint-grad-201-t.svg)| -|❌|[paint-grad-202-t](SVGViewTests/w3c/1.2T/svg/paint-grad-202-t.svg)| -|❌|[paint-grad-203-t](SVGViewTests/w3c/1.2T/svg/paint-grad-203-t.svg)| -|❌|[paint-grad-204-t](SVGViewTests/w3c/1.2T/svg/paint-grad-204-t.svg)| -|❌|[paint-grad-205-t](SVGViewTests/w3c/1.2T/svg/paint-grad-205-t.svg)| -|❌|[paint-nsstroke-201-t](SVGViewTests/w3c/1.2T/svg/paint-nsstroke-201-t.svg)| -|❌|[paint-nsstroke-202-t](SVGViewTests/w3c/1.2T/svg/paint-nsstroke-202-t.svg)| -|❌|[paint-nsstroke-203-t](SVGViewTests/w3c/1.2T/svg/paint-nsstroke-203-t.svg)| -|❌|[paint-other-201-t](SVGViewTests/w3c/1.2T/svg/paint-other-201-t.svg)| -|❌|[paint-other-202-t](SVGViewTests/w3c/1.2T/svg/paint-other-202-t.svg)| -|❌|[paint-other-203-t](SVGViewTests/w3c/1.2T/svg/paint-other-203-t.svg)| -|✅|[paint-stroke-01-t](SVGViewTests/w3c/1.2T/svg/paint-stroke-01-t.svg)| -|❌|[paint-stroke-02-t](SVGViewTests/w3c/1.2T/svg/paint-stroke-02-t.svg)| -|❌|[paint-stroke-03-t](SVGViewTests/w3c/1.2T/svg/paint-stroke-03-t.svg)| -|❌|[paint-stroke-04-t](SVGViewTests/w3c/1.2T/svg/paint-stroke-04-t.svg)| -|❌|[paint-stroke-05-t](SVGViewTests/w3c/1.2T/svg/paint-stroke-05-t.svg)| -|❌|[paint-stroke-06-t](SVGViewTests/w3c/1.2T/svg/paint-stroke-06-t.svg)| -|❌|[paint-stroke-07-t](SVGViewTests/w3c/1.2T/svg/paint-stroke-07-t.svg)| -|❌|[paint-stroke-08-t](SVGViewTests/w3c/1.2T/svg/paint-stroke-08-t.svg)| -|❌|[paint-stroke-201-t](SVGViewTests/w3c/1.2T/svg/paint-stroke-201-t.svg)| -|❌|[paint-stroke-202-t](SVGViewTests/w3c/1.2T/svg/paint-stroke-202-t.svg)| -|❌|[paint-stroke-203-t](SVGViewTests/w3c/1.2T/svg/paint-stroke-203-t.svg)| -|❌|[paint-stroke-204-t](SVGViewTests/w3c/1.2T/svg/paint-stroke-204-t.svg)| -|❌|[paint-stroke-205-t](SVGViewTests/w3c/1.2T/svg/paint-stroke-205-t.svg)| -|❌|[paint-stroke-206-t](SVGViewTests/w3c/1.2T/svg/paint-stroke-206-t.svg)| -|❌|[paint-stroke-207-t](SVGViewTests/w3c/1.2T/svg/paint-stroke-207-t.svg)| -|❌|[paint-vfill-201-t](SVGViewTests/w3c/1.2T/svg/paint-vfill-201-t.svg)| -|❌|[paint-vfill-202-t](SVGViewTests/w3c/1.2T/svg/paint-vfill-202-t.svg)| -|❌|[paint-vfill-203-t](SVGViewTests/w3c/1.2T/svg/paint-vfill-203-t.svg)| -|❌|[paint-vfill-204-t](SVGViewTests/w3c/1.2T/svg/paint-vfill-204-t.svg)| -|❌|[paint-vfill-205-t](SVGViewTests/w3c/1.2T/svg/paint-vfill-205-t.svg)| -|❌|[paint-vfill-206-t](SVGViewTests/w3c/1.2T/svg/paint-vfill-206-t.svg)| +|❌|[paint-color-01-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-color-01-t.svg)| +|✅|[paint-color-03-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-color-03-t.svg)| +|❌|[paint-color-04-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-color-04-t.svg)| +|❌|[paint-color-05-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-color-05-t.svg)| +|✅|[paint-color-201-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-color-201-t.svg)| +|❌|[paint-fill-01-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-fill-01-t.svg)| +|❌|[paint-fill-02-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-fill-02-t.svg)| +|❌|[paint-fill-03-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-fill-03-t.svg)| +|✅|[paint-fill-04-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-fill-04-t.svg)| +|❌|[paint-fill-05-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-fill-05-t.svg)| +|✅|[paint-fill-06-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-fill-06-t.svg)| +|❌|[paint-grad-04-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-grad-04-t.svg)| +|❌|[paint-grad-05-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-grad-05-t.svg)| +|❌|[paint-grad-07-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-grad-07-t.svg)| +|❌|[paint-grad-08-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-grad-08-t.svg)| +|❌|[paint-grad-09-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-grad-09-t.svg)| +|❌|[paint-grad-11-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-grad-11-t.svg)| +|❌|[paint-grad-12-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-grad-12-t.svg)| +|❌|[paint-grad-15-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-grad-15-t.svg)| +|❌|[paint-grad-16-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-grad-16-t.svg)| +|❌|[paint-grad-17-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-grad-17-t.svg)| +|❌|[paint-grad-18-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-grad-18-t.svg)| +|❌|[paint-grad-19-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-grad-19-t.svg)| +|❌|[paint-grad-201-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-grad-201-t.svg)| +|❌|[paint-grad-202-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-grad-202-t.svg)| +|❌|[paint-grad-203-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-grad-203-t.svg)| +|❌|[paint-grad-204-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-grad-204-t.svg)| +|❌|[paint-grad-205-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-grad-205-t.svg)| +|❌|[paint-nsstroke-201-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-nsstroke-201-t.svg)| +|❌|[paint-nsstroke-202-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-nsstroke-202-t.svg)| +|❌|[paint-nsstroke-203-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-nsstroke-203-t.svg)| +|❌|[paint-other-201-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-other-201-t.svg)| +|❌|[paint-other-202-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-other-202-t.svg)| +|❌|[paint-other-203-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-other-203-t.svg)| +|✅|[paint-stroke-01-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-stroke-01-t.svg)| +|❌|[paint-stroke-02-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-stroke-02-t.svg)| +|❌|[paint-stroke-03-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-stroke-03-t.svg)| +|❌|[paint-stroke-04-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-stroke-04-t.svg)| +|❌|[paint-stroke-05-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-stroke-05-t.svg)| +|❌|[paint-stroke-06-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-stroke-06-t.svg)| +|❌|[paint-stroke-07-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-stroke-07-t.svg)| +|❌|[paint-stroke-08-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-stroke-08-t.svg)| +|❌|[paint-stroke-201-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-stroke-201-t.svg)| +|❌|[paint-stroke-202-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-stroke-202-t.svg)| +|❌|[paint-stroke-203-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-stroke-203-t.svg)| +|❌|[paint-stroke-204-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-stroke-204-t.svg)| +|❌|[paint-stroke-205-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-stroke-205-t.svg)| +|❌|[paint-stroke-206-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-stroke-206-t.svg)| +|❌|[paint-stroke-207-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-stroke-207-t.svg)| +|❌|[paint-vfill-201-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-vfill-201-t.svg)| +|❌|[paint-vfill-202-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-vfill-202-t.svg)| +|❌|[paint-vfill-203-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-vfill-203-t.svg)| +|❌|[paint-vfill-204-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-vfill-204-t.svg)| +|❌|[paint-vfill-205-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-vfill-205-t.svg)| +|❌|[paint-vfill-206-t](Tests/SVGViewTests/w3c/1.2T/svg/paint-vfill-206-t.svg)| ### [Paths](https://www.w3.org/TR/SVGTiny12/paths.html): `15.3%` @@ -1206,19 +1206,19 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|✅|[paths-data-01-t](SVGViewTests/w3c/1.2T/svg/paths-data-01-t.svg)| -|✅|[paths-data-02-t](SVGViewTests/w3c/1.2T/svg/paths-data-02-t.svg)| -|❌|[paths-data-04-t](SVGViewTests/w3c/1.2T/svg/paths-data-04-t.svg)| -|❌|[paths-data-05-t](SVGViewTests/w3c/1.2T/svg/paths-data-05-t.svg)| -|❌|[paths-data-06-t](SVGViewTests/w3c/1.2T/svg/paths-data-06-t.svg)| -|❌|[paths-data-07-t](SVGViewTests/w3c/1.2T/svg/paths-data-07-t.svg)| -|❌|[paths-data-08-t](SVGViewTests/w3c/1.2T/svg/paths-data-08-t.svg)| -|❌|[paths-data-09-t](SVGViewTests/w3c/1.2T/svg/paths-data-09-t.svg)| -|❌|[paths-data-10-t](SVGViewTests/w3c/1.2T/svg/paths-data-10-t.svg)| -|❌|[paths-data-12-t](SVGViewTests/w3c/1.2T/svg/paths-data-12-t.svg)| -|❌|[paths-data-13-t](SVGViewTests/w3c/1.2T/svg/paths-data-13-t.svg)| -|❌|[paths-data-14-t](SVGViewTests/w3c/1.2T/svg/paths-data-14-t.svg)| -|❌|[paths-data-15-t](SVGViewTests/w3c/1.2T/svg/paths-data-15-t.svg)| +|✅|[paths-data-01-t](Tests/SVGViewTests/w3c/1.2T/svg/paths-data-01-t.svg)| +|✅|[paths-data-02-t](Tests/SVGViewTests/w3c/1.2T/svg/paths-data-02-t.svg)| +|❌|[paths-data-04-t](Tests/SVGViewTests/w3c/1.2T/svg/paths-data-04-t.svg)| +|❌|[paths-data-05-t](Tests/SVGViewTests/w3c/1.2T/svg/paths-data-05-t.svg)| +|❌|[paths-data-06-t](Tests/SVGViewTests/w3c/1.2T/svg/paths-data-06-t.svg)| +|❌|[paths-data-07-t](Tests/SVGViewTests/w3c/1.2T/svg/paths-data-07-t.svg)| +|❌|[paths-data-08-t](Tests/SVGViewTests/w3c/1.2T/svg/paths-data-08-t.svg)| +|❌|[paths-data-09-t](Tests/SVGViewTests/w3c/1.2T/svg/paths-data-09-t.svg)| +|❌|[paths-data-10-t](Tests/SVGViewTests/w3c/1.2T/svg/paths-data-10-t.svg)| +|❌|[paths-data-12-t](Tests/SVGViewTests/w3c/1.2T/svg/paths-data-12-t.svg)| +|❌|[paths-data-13-t](Tests/SVGViewTests/w3c/1.2T/svg/paths-data-13-t.svg)| +|❌|[paths-data-14-t](Tests/SVGViewTests/w3c/1.2T/svg/paths-data-14-t.svg)| +|❌|[paths-data-15-t](Tests/SVGViewTests/w3c/1.2T/svg/paths-data-15-t.svg)| ### [Render](https://www.w3.org/TR/SVGTiny12/render.html): `37.5%` @@ -1228,14 +1228,14 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|✅|[render-elems-01-t](SVGViewTests/w3c/1.2T/svg/render-elems-01-t.svg)| -|✅|[render-elems-02-t](SVGViewTests/w3c/1.2T/svg/render-elems-02-t.svg)| -|✅|[render-elems-03-t](SVGViewTests/w3c/1.2T/svg/render-elems-03-t.svg)| -|❌|[render-elems-06-t](SVGViewTests/w3c/1.2T/svg/render-elems-06-t.svg)| -|❌|[render-elems-07-t](SVGViewTests/w3c/1.2T/svg/render-elems-07-t.svg)| -|❌|[render-elems-08-t](SVGViewTests/w3c/1.2T/svg/render-elems-08-t.svg)| -|❌|[render-groups-01-t](SVGViewTests/w3c/1.2T/svg/render-groups-01-t.svg)| -|❌|[render-groups-03-t](SVGViewTests/w3c/1.2T/svg/render-groups-03-t.svg)| +|✅|[render-elems-01-t](Tests/SVGViewTests/w3c/1.2T/svg/render-elems-01-t.svg)| +|✅|[render-elems-02-t](Tests/SVGViewTests/w3c/1.2T/svg/render-elems-02-t.svg)| +|✅|[render-elems-03-t](Tests/SVGViewTests/w3c/1.2T/svg/render-elems-03-t.svg)| +|❌|[render-elems-06-t](Tests/SVGViewTests/w3c/1.2T/svg/render-elems-06-t.svg)| +|❌|[render-elems-07-t](Tests/SVGViewTests/w3c/1.2T/svg/render-elems-07-t.svg)| +|❌|[render-elems-08-t](Tests/SVGViewTests/w3c/1.2T/svg/render-elems-08-t.svg)| +|❌|[render-groups-01-t](Tests/SVGViewTests/w3c/1.2T/svg/render-groups-01-t.svg)| +|❌|[render-groups-03-t](Tests/SVGViewTests/w3c/1.2T/svg/render-groups-03-t.svg)| ### [Script](https://www.w3.org/TR/SVGTiny12/script.html): `0.0%` @@ -1245,21 +1245,21 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[script-element-201-t](SVGViewTests/w3c/1.2T/svg/script-element-201-t.svg)| -|❌|[script-element-202-t](SVGViewTests/w3c/1.2T/svg/script-element-202-t.svg)| -|❌|[script-element-203-t](SVGViewTests/w3c/1.2T/svg/script-element-203-t.svg)| -|❌|[script-handle-05-t](SVGViewTests/w3c/1.2T/svg/script-handle-05-t.svg)| -|❌|[script-handle-06-t](SVGViewTests/w3c/1.2T/svg/script-handle-06-t.svg)| -|❌|[script-handle-07-t](SVGViewTests/w3c/1.2T/svg/script-handle-07-t.svg)| -|❌|[script-handle-08-t](SVGViewTests/w3c/1.2T/svg/script-handle-08-t.svg)| -|❌|[script-handle-201-t](SVGViewTests/w3c/1.2T/svg/script-handle-201-t.svg)| -|❌|[script-handle-202-t](SVGViewTests/w3c/1.2T/svg/script-handle-202-t.svg)| -|❌|[script-handler-201-t](SVGViewTests/w3c/1.2T/svg/script-handler-201-t.svg)| -|❌|[script-handler-202-t](SVGViewTests/w3c/1.2T/svg/script-handler-202-t.svg)| -|❌|[script-listener-201-t](SVGViewTests/w3c/1.2T/svg/script-listener-201-t.svg)| -|❌|[script-listener-202-t](SVGViewTests/w3c/1.2T/svg/script-listener-202-t.svg)| -|❌|[script-listener-203-t](SVGViewTests/w3c/1.2T/svg/script-listener-203-t.svg)| -|❌|[script-listener-204-t](SVGViewTests/w3c/1.2T/svg/script-listener-204-t.svg)| +|❌|[script-element-201-t](Tests/SVGViewTests/w3c/1.2T/svg/script-element-201-t.svg)| +|❌|[script-element-202-t](Tests/SVGViewTests/w3c/1.2T/svg/script-element-202-t.svg)| +|❌|[script-element-203-t](Tests/SVGViewTests/w3c/1.2T/svg/script-element-203-t.svg)| +|❌|[script-handle-05-t](Tests/SVGViewTests/w3c/1.2T/svg/script-handle-05-t.svg)| +|❌|[script-handle-06-t](Tests/SVGViewTests/w3c/1.2T/svg/script-handle-06-t.svg)| +|❌|[script-handle-07-t](Tests/SVGViewTests/w3c/1.2T/svg/script-handle-07-t.svg)| +|❌|[script-handle-08-t](Tests/SVGViewTests/w3c/1.2T/svg/script-handle-08-t.svg)| +|❌|[script-handle-201-t](Tests/SVGViewTests/w3c/1.2T/svg/script-handle-201-t.svg)| +|❌|[script-handle-202-t](Tests/SVGViewTests/w3c/1.2T/svg/script-handle-202-t.svg)| +|❌|[script-handler-201-t](Tests/SVGViewTests/w3c/1.2T/svg/script-handler-201-t.svg)| +|❌|[script-handler-202-t](Tests/SVGViewTests/w3c/1.2T/svg/script-handler-202-t.svg)| +|❌|[script-listener-201-t](Tests/SVGViewTests/w3c/1.2T/svg/script-listener-201-t.svg)| +|❌|[script-listener-202-t](Tests/SVGViewTests/w3c/1.2T/svg/script-listener-202-t.svg)| +|❌|[script-listener-203-t](Tests/SVGViewTests/w3c/1.2T/svg/script-listener-203-t.svg)| +|❌|[script-listener-204-t](Tests/SVGViewTests/w3c/1.2T/svg/script-listener-204-t.svg)| ### [Shapes](https://www.w3.org/TR/SVGTiny12/shapes.html): `37.5%` @@ -1269,22 +1269,22 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|✅|[shapes-circle-01-t](SVGViewTests/w3c/1.2T/svg/shapes-circle-01-t.svg)| -|❌|[shapes-circle-02-t](SVGViewTests/w3c/1.2T/svg/shapes-circle-02-t.svg)| -|❌|[shapes-circle-03-t](SVGViewTests/w3c/1.2T/svg/shapes-circle-03-t.svg)| -|✅|[shapes-ellipse-01-t](SVGViewTests/w3c/1.2T/svg/shapes-ellipse-01-t.svg)| -|❌|[shapes-ellipse-02-t](SVGViewTests/w3c/1.2T/svg/shapes-ellipse-02-t.svg)| -|❌|[shapes-ellipse-03-t](SVGViewTests/w3c/1.2T/svg/shapes-ellipse-03-t.svg)| -|❌|[shapes-intro-01-t](SVGViewTests/w3c/1.2T/svg/shapes-intro-01-t.svg)| -|✅|[shapes-line-01-t](SVGViewTests/w3c/1.2T/svg/shapes-line-01-t.svg)| -|❌|[shapes-line-02-t](SVGViewTests/w3c/1.2T/svg/shapes-line-02-t.svg)| -|✅|[shapes-polygon-01-t](SVGViewTests/w3c/1.2T/svg/shapes-polygon-01-t.svg)| -|❌|[shapes-polygon-02-t](SVGViewTests/w3c/1.2T/svg/shapes-polygon-02-t.svg)| -|✅|[shapes-polyline-01-t](SVGViewTests/w3c/1.2T/svg/shapes-polyline-01-t.svg)| -|❌|[shapes-polyline-02-t](SVGViewTests/w3c/1.2T/svg/shapes-polyline-02-t.svg)| -|❌|[shapes-rect-01-t](SVGViewTests/w3c/1.2T/svg/shapes-rect-01-t.svg)| -|✅|[shapes-rect-02-t](SVGViewTests/w3c/1.2T/svg/shapes-rect-02-t.svg)| -|❌|[shapes-rect-03-t](SVGViewTests/w3c/1.2T/svg/shapes-rect-03-t.svg)| +|✅|[shapes-circle-01-t](Tests/SVGViewTests/w3c/1.2T/svg/shapes-circle-01-t.svg)| +|❌|[shapes-circle-02-t](Tests/SVGViewTests/w3c/1.2T/svg/shapes-circle-02-t.svg)| +|❌|[shapes-circle-03-t](Tests/SVGViewTests/w3c/1.2T/svg/shapes-circle-03-t.svg)| +|✅|[shapes-ellipse-01-t](Tests/SVGViewTests/w3c/1.2T/svg/shapes-ellipse-01-t.svg)| +|❌|[shapes-ellipse-02-t](Tests/SVGViewTests/w3c/1.2T/svg/shapes-ellipse-02-t.svg)| +|❌|[shapes-ellipse-03-t](Tests/SVGViewTests/w3c/1.2T/svg/shapes-ellipse-03-t.svg)| +|❌|[shapes-intro-01-t](Tests/SVGViewTests/w3c/1.2T/svg/shapes-intro-01-t.svg)| +|✅|[shapes-line-01-t](Tests/SVGViewTests/w3c/1.2T/svg/shapes-line-01-t.svg)| +|❌|[shapes-line-02-t](Tests/SVGViewTests/w3c/1.2T/svg/shapes-line-02-t.svg)| +|✅|[shapes-polygon-01-t](Tests/SVGViewTests/w3c/1.2T/svg/shapes-polygon-01-t.svg)| +|❌|[shapes-polygon-02-t](Tests/SVGViewTests/w3c/1.2T/svg/shapes-polygon-02-t.svg)| +|✅|[shapes-polyline-01-t](Tests/SVGViewTests/w3c/1.2T/svg/shapes-polyline-01-t.svg)| +|❌|[shapes-polyline-02-t](Tests/SVGViewTests/w3c/1.2T/svg/shapes-polyline-02-t.svg)| +|❌|[shapes-rect-01-t](Tests/SVGViewTests/w3c/1.2T/svg/shapes-rect-01-t.svg)| +|✅|[shapes-rect-02-t](Tests/SVGViewTests/w3c/1.2T/svg/shapes-rect-02-t.svg)| +|❌|[shapes-rect-03-t](Tests/SVGViewTests/w3c/1.2T/svg/shapes-rect-03-t.svg)| ### [Struct](https://www.w3.org/TR/SVGTiny12/struct.html): `4.5%` @@ -1294,72 +1294,72 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[struct-class-201-t](SVGViewTests/w3c/1.2T/svg/struct-class-201-t.svg)| -|❌|[struct-common-201-t](SVGViewTests/w3c/1.2T/svg/struct-common-201-t.svg)| -|❌|[struct-cond-01-t](SVGViewTests/w3c/1.2T/svg/struct-cond-01-t.svg)| -|❌|[struct-cond-02-t](SVGViewTests/w3c/1.2T/svg/struct-cond-02-t.svg)| -|❌|[struct-cond-03-t](SVGViewTests/w3c/1.2T/svg/struct-cond-03-t.svg)| -|❌|[struct-cond-204-t](SVGViewTests/w3c/1.2T/svg/struct-cond-204-t.svg)| -|❌|[struct-cond-205-t](SVGViewTests/w3c/1.2T/svg/struct-cond-205-t.svg)| -|❌|[struct-cond-206-t](SVGViewTests/w3c/1.2T/svg/struct-cond-206-t.svg)| -|❌|[struct-cond-207-t](SVGViewTests/w3c/1.2T/svg/struct-cond-207-t.svg)| -|❌|[struct-cond-208-t](SVGViewTests/w3c/1.2T/svg/struct-cond-208-t.svg)| -|❌|[struct-cond-209-t](SVGViewTests/w3c/1.2T/svg/struct-cond-209-t.svg)| -|❌|[struct-cond-210-t](SVGViewTests/w3c/1.2T/svg/struct-cond-210-t.svg)| -|❌|[struct-cond-211-t](SVGViewTests/w3c/1.2T/svg/struct-cond-211-t.svg)| -|❌|[struct-cond-212-t](SVGViewTests/w3c/1.2T/svg/struct-cond-212-t.svg)| -|❌|[struct-cond-213-t](SVGViewTests/w3c/1.2T/svg/struct-cond-213-t.svg)| -|✅|[struct-defs-01-t](SVGViewTests/w3c/1.2T/svg/struct-defs-01-t.svg)| -|❌|[struct-defs-201-t](SVGViewTests/w3c/1.2T/svg/struct-defs-201-t.svg)| -|❌|[struct-discard-201-t](SVGViewTests/w3c/1.2T/svg/struct-discard-201-t.svg)| -|❌|[struct-discard-202-t](SVGViewTests/w3c/1.2T/svg/struct-discard-202-t.svg)| -|❌|[struct-discard-203-t](SVGViewTests/w3c/1.2T/svg/struct-discard-203-t.svg)| -|❌|[struct-discard-204-t](SVGViewTests/w3c/1.2T/svg/struct-discard-204-t.svg)| -|❌|[struct-discard-205-t](SVGViewTests/w3c/1.2T/svg/struct-discard-205-t.svg)| -|❌|[struct-discard-206-t](SVGViewTests/w3c/1.2T/svg/struct-discard-206-t.svg)| -|❌|[struct-discard-207-t](SVGViewTests/w3c/1.2T/svg/struct-discard-207-t.svg)| -|❌|[struct-discard-208-t](SVGViewTests/w3c/1.2T/svg/struct-discard-208-t.svg)| -|✅|[struct-frag-01-t](SVGViewTests/w3c/1.2T/svg/struct-frag-01-t.svg)| -|❌|[struct-frag-02-t](SVGViewTests/w3c/1.2T/svg/struct-frag-02-t.svg)| -|❌|[struct-frag-03-t](SVGViewTests/w3c/1.2T/svg/struct-frag-03-t.svg)| -|❌|[struct-frag-04-t](SVGViewTests/w3c/1.2T/svg/struct-frag-04-t.svg)| -|❌|[struct-frag-05-t](SVGViewTests/w3c/1.2T/svg/struct-frag-05-t.svg)| -|❌|[struct-frag-06-t](SVGViewTests/w3c/1.2T/svg/struct-frag-06-t.svg)| -|❌|[struct-group-01-t](SVGViewTests/w3c/1.2T/svg/struct-group-01-t.svg)| -|❌|[struct-group-03-t](SVGViewTests/w3c/1.2T/svg/struct-group-03-t.svg)| -|❌|[struct-image-01-t](SVGViewTests/w3c/1.2T/svg/struct-image-01-t.svg)| -|❌|[struct-image-03-t](SVGViewTests/w3c/1.2T/svg/struct-image-03-t.svg)| -|❌|[struct-image-04-t](SVGViewTests/w3c/1.2T/svg/struct-image-04-t.svg)| -|❌|[struct-image-06-t](SVGViewTests/w3c/1.2T/svg/struct-image-06-t.svg)| -|❌|[struct-image-07-t](SVGViewTests/w3c/1.2T/svg/struct-image-07-t.svg)| -|❌|[struct-image-08-t](SVGViewTests/w3c/1.2T/svg/struct-image-08-t.svg)| -|❌|[struct-image-09-t](SVGViewTests/w3c/1.2T/svg/struct-image-09-t.svg)| -|❌|[struct-image-10-t](SVGViewTests/w3c/1.2T/svg/struct-image-10-t.svg)| -|❌|[struct-prefetch-201-t](SVGViewTests/w3c/1.2T/svg/struct-prefetch-201-t.svg)| -|❌|[struct-progressive-201-t](SVGViewTests/w3c/1.2T/svg/struct-progressive-201-t.svg)| -|❌|[struct-progressive-202-t](SVGViewTests/w3c/1.2T/svg/struct-progressive-202-t.svg)| -|❌|[struct-progressive-203-t](SVGViewTests/w3c/1.2T/svg/struct-progressive-203-t.svg)| -|❌|[struct-progressive-204-t](SVGViewTests/w3c/1.2T/svg/struct-progressive-204-t.svg)| -|❌|[struct-svg-201-t](SVGViewTests/w3c/1.2T/svg/struct-svg-201-t.svg)| -|❌|[struct-svg-202-t](SVGViewTests/w3c/1.2T/svg/struct-svg-202-t.svg)| -|❌|[struct-svg-203-t](SVGViewTests/w3c/1.2T/svg/struct-svg-203-t.svg)| -|❌|[struct-svg-204-t](SVGViewTests/w3c/1.2T/svg/struct-svg-204-t.svg)| -|❌|[struct-use-01-t](SVGViewTests/w3c/1.2T/svg/struct-use-01-t.svg)| -|✅|[struct-use-03-t](SVGViewTests/w3c/1.2T/svg/struct-use-03-t.svg)| -|❌|[struct-use-09-t](SVGViewTests/w3c/1.2T/svg/struct-use-09-t.svg)| -|❌|[struct-use-201-t](SVGViewTests/w3c/1.2T/svg/struct-use-201-t.svg)| -|❌|[struct-use-202-t](SVGViewTests/w3c/1.2T/svg/struct-use-202-t.svg)| -|❌|[struct-use-203-t](SVGViewTests/w3c/1.2T/svg/struct-use-203-t.svg)| -|❌|[struct-use-204-t](SVGViewTests/w3c/1.2T/svg/struct-use-204-t.svg)| -|❌|[struct-use-205-t](SVGViewTests/w3c/1.2T/svg/struct-use-205-t.svg)| -|❌|[struct-use-206-t](SVGViewTests/w3c/1.2T/svg/struct-use-206-t.svg)| -|❌|[struct-use-207-t](SVGViewTests/w3c/1.2T/svg/struct-use-207-t.svg)| -|❌|[struct-use-208-t](SVGViewTests/w3c/1.2T/svg/struct-use-208-t.svg)| -|❌|[struct-use-209-t](SVGViewTests/w3c/1.2T/svg/struct-use-209-t.svg)| -|❌|[struct-use-210-t](SVGViewTests/w3c/1.2T/svg/struct-use-210-t.svg)| -|❌|[struct-use-recursion-01-t](SVGViewTests/w3c/1.2T/svg/struct-use-recursion-01-t.svg)| -|❌|[struct-use-recursion-02-t](SVGViewTests/w3c/1.2T/svg/struct-use-recursion-02-t.svg)| -|❌|[struct-use-recursion-03-t](SVGViewTests/w3c/1.2T/svg/struct-use-recursion-03-t.svg)| +|❌|[struct-class-201-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-class-201-t.svg)| +|❌|[struct-common-201-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-common-201-t.svg)| +|❌|[struct-cond-01-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-cond-01-t.svg)| +|❌|[struct-cond-02-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-cond-02-t.svg)| +|❌|[struct-cond-03-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-cond-03-t.svg)| +|❌|[struct-cond-204-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-cond-204-t.svg)| +|❌|[struct-cond-205-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-cond-205-t.svg)| +|❌|[struct-cond-206-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-cond-206-t.svg)| +|❌|[struct-cond-207-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-cond-207-t.svg)| +|❌|[struct-cond-208-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-cond-208-t.svg)| +|❌|[struct-cond-209-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-cond-209-t.svg)| +|❌|[struct-cond-210-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-cond-210-t.svg)| +|❌|[struct-cond-211-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-cond-211-t.svg)| +|❌|[struct-cond-212-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-cond-212-t.svg)| +|❌|[struct-cond-213-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-cond-213-t.svg)| +|✅|[struct-defs-01-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-defs-01-t.svg)| +|❌|[struct-defs-201-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-defs-201-t.svg)| +|❌|[struct-discard-201-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-discard-201-t.svg)| +|❌|[struct-discard-202-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-discard-202-t.svg)| +|❌|[struct-discard-203-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-discard-203-t.svg)| +|❌|[struct-discard-204-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-discard-204-t.svg)| +|❌|[struct-discard-205-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-discard-205-t.svg)| +|❌|[struct-discard-206-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-discard-206-t.svg)| +|❌|[struct-discard-207-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-discard-207-t.svg)| +|❌|[struct-discard-208-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-discard-208-t.svg)| +|✅|[struct-frag-01-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-frag-01-t.svg)| +|❌|[struct-frag-02-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-frag-02-t.svg)| +|❌|[struct-frag-03-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-frag-03-t.svg)| +|❌|[struct-frag-04-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-frag-04-t.svg)| +|❌|[struct-frag-05-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-frag-05-t.svg)| +|❌|[struct-frag-06-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-frag-06-t.svg)| +|❌|[struct-group-01-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-group-01-t.svg)| +|❌|[struct-group-03-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-group-03-t.svg)| +|❌|[struct-image-01-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-image-01-t.svg)| +|❌|[struct-image-03-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-image-03-t.svg)| +|❌|[struct-image-04-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-image-04-t.svg)| +|❌|[struct-image-06-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-image-06-t.svg)| +|❌|[struct-image-07-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-image-07-t.svg)| +|❌|[struct-image-08-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-image-08-t.svg)| +|❌|[struct-image-09-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-image-09-t.svg)| +|❌|[struct-image-10-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-image-10-t.svg)| +|❌|[struct-prefetch-201-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-prefetch-201-t.svg)| +|❌|[struct-progressive-201-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-progressive-201-t.svg)| +|❌|[struct-progressive-202-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-progressive-202-t.svg)| +|❌|[struct-progressive-203-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-progressive-203-t.svg)| +|❌|[struct-progressive-204-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-progressive-204-t.svg)| +|❌|[struct-svg-201-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-svg-201-t.svg)| +|❌|[struct-svg-202-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-svg-202-t.svg)| +|❌|[struct-svg-203-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-svg-203-t.svg)| +|❌|[struct-svg-204-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-svg-204-t.svg)| +|❌|[struct-use-01-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-use-01-t.svg)| +|✅|[struct-use-03-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-use-03-t.svg)| +|❌|[struct-use-09-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-use-09-t.svg)| +|❌|[struct-use-201-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-use-201-t.svg)| +|❌|[struct-use-202-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-use-202-t.svg)| +|❌|[struct-use-203-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-use-203-t.svg)| +|❌|[struct-use-204-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-use-204-t.svg)| +|❌|[struct-use-205-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-use-205-t.svg)| +|❌|[struct-use-206-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-use-206-t.svg)| +|❌|[struct-use-207-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-use-207-t.svg)| +|❌|[struct-use-208-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-use-208-t.svg)| +|❌|[struct-use-209-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-use-209-t.svg)| +|❌|[struct-use-210-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-use-210-t.svg)| +|❌|[struct-use-recursion-01-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-use-recursion-01-t.svg)| +|❌|[struct-use-recursion-02-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-use-recursion-02-t.svg)| +|❌|[struct-use-recursion-03-t](Tests/SVGViewTests/w3c/1.2T/svg/struct-use-recursion-03-t.svg)| ### [Styling](https://www.w3.org/TR/SVGTiny12/styling.html): `0.0%` @@ -1369,10 +1369,10 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[styling-inherit-01-t](SVGViewTests/w3c/1.2T/svg/styling-inherit-01-t.svg)| -|❌|[styling-inherit-02-t](SVGViewTests/w3c/1.2T/svg/styling-inherit-02-t.svg)| -|❌|[styling-inherit-03-t](SVGViewTests/w3c/1.2T/svg/styling-inherit-03-t.svg)| -|❌|[styling-pres-01-t](SVGViewTests/w3c/1.2T/svg/styling-pres-01-t.svg)| +|❌|[styling-inherit-01-t](Tests/SVGViewTests/w3c/1.2T/svg/styling-inherit-01-t.svg)| +|❌|[styling-inherit-02-t](Tests/SVGViewTests/w3c/1.2T/svg/styling-inherit-02-t.svg)| +|❌|[styling-inherit-03-t](Tests/SVGViewTests/w3c/1.2T/svg/styling-inherit-03-t.svg)| +|❌|[styling-pres-01-t](Tests/SVGViewTests/w3c/1.2T/svg/styling-pres-01-t.svg)| ### [Text](https://www.w3.org/TR/SVGTiny12/text.html): `0.0%` @@ -1382,54 +1382,54 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[text-align-01-t](SVGViewTests/w3c/1.2T/svg/text-align-01-t.svg)| -|❌|[text-align-07-t](SVGViewTests/w3c/1.2T/svg/text-align-07-t.svg)| -|❌|[text-align-08-t](SVGViewTests/w3c/1.2T/svg/text-align-08-t.svg)| -|❌|[text-align-201-t](SVGViewTests/w3c/1.2T/svg/text-align-201-t.svg)| -|❌|[text-align-202-t](SVGViewTests/w3c/1.2T/svg/text-align-202-t.svg)| -|❌|[text-align-203-t](SVGViewTests/w3c/1.2T/svg/text-align-203-t.svg)| -|❌|[text-align-204-t](SVGViewTests/w3c/1.2T/svg/text-align-204-t.svg)| -|❌|[text-area-201-t](SVGViewTests/w3c/1.2T/svg/text-area-201-t.svg)| -|❌|[text-area-202-t](SVGViewTests/w3c/1.2T/svg/text-area-202-t.svg)| -|❌|[text-area-203-t](SVGViewTests/w3c/1.2T/svg/text-area-203-t.svg)| -|❌|[text-area-204-t](SVGViewTests/w3c/1.2T/svg/text-area-204-t.svg)| -|❌|[text-area-205-t](SVGViewTests/w3c/1.2T/svg/text-area-205-t.svg)| -|❌|[text-area-206-t](SVGViewTests/w3c/1.2T/svg/text-area-206-t.svg)| -|❌|[text-area-207-t](SVGViewTests/w3c/1.2T/svg/text-area-207-t.svg)| -|❌|[text-area-208-t](SVGViewTests/w3c/1.2T/svg/text-area-208-t.svg)| -|❌|[text-area-209-t](SVGViewTests/w3c/1.2T/svg/text-area-209-t.svg)| -|❌|[text-area-210-t](SVGViewTests/w3c/1.2T/svg/text-area-210-t.svg)| -|❌|[text-area-211-t](SVGViewTests/w3c/1.2T/svg/text-area-211-t.svg)| -|❌|[text-area-212-t](SVGViewTests/w3c/1.2T/svg/text-area-212-t.svg)| -|❌|[text-area-213-t](SVGViewTests/w3c/1.2T/svg/text-area-213-t.svg)| -|❌|[text-area-220-t](SVGViewTests/w3c/1.2T/svg/text-area-220-t.svg)| -|❌|[text-area-221-t](SVGViewTests/w3c/1.2T/svg/text-area-221-t.svg)| -|❌|[text-area-222-t](SVGViewTests/w3c/1.2T/svg/text-area-222-t.svg)| -|❌|[text-area-223-t](SVGViewTests/w3c/1.2T/svg/text-area-223-t.svg)| -|❌|[text-area-224-t](SVGViewTests/w3c/1.2T/svg/text-area-224-t.svg)| -|❌|[text-area-225-t](SVGViewTests/w3c/1.2T/svg/text-area-225-t.svg)| -|❌|[text-edit-201-t](SVGViewTests/w3c/1.2T/svg/text-edit-201-t.svg)| -|❌|[text-fonts-01-t](SVGViewTests/w3c/1.2T/svg/text-fonts-01-t.svg)| -|❌|[text-fonts-02-t](SVGViewTests/w3c/1.2T/svg/text-fonts-02-t.svg)| -|❌|[text-fonts-03-t](SVGViewTests/w3c/1.2T/svg/text-fonts-03-t.svg)| -|❌|[text-fonts-04-t](SVGViewTests/w3c/1.2T/svg/text-fonts-04-t.svg)| -|❌|[text-fonts-202-t](SVGViewTests/w3c/1.2T/svg/text-fonts-202-t.svg)| -|❌|[text-fonts-203-t](SVGViewTests/w3c/1.2T/svg/text-fonts-203-t.svg)| -|❌|[text-intro-01-t](SVGViewTests/w3c/1.2T/svg/text-intro-01-t.svg)| -|❌|[text-intro-04-t](SVGViewTests/w3c/1.2T/svg/text-intro-04-t.svg)| -|❌|[text-intro-05-t](SVGViewTests/w3c/1.2T/svg/text-intro-05-t.svg)| -|❌|[text-intro-06-t](SVGViewTests/w3c/1.2T/svg/text-intro-06-t.svg)| -|❌|[text-intro-201-t](SVGViewTests/w3c/1.2T/svg/text-intro-201-t.svg)| -|❌|[text-layout-201-t](SVGViewTests/w3c/1.2T/svg/text-layout-201-t.svg)| -|❌|[text-text-04-t](SVGViewTests/w3c/1.2T/svg/text-text-04-t.svg)| -|❌|[text-text-05-t](SVGViewTests/w3c/1.2T/svg/text-text-05-t.svg)| -|❌|[text-text-06-t](SVGViewTests/w3c/1.2T/svg/text-text-06-t.svg)| -|❌|[text-text-07-t](SVGViewTests/w3c/1.2T/svg/text-text-07-t.svg)| -|❌|[text-text-08-t](SVGViewTests/w3c/1.2T/svg/text-text-08-t.svg)| -|❌|[text-text-09-t](SVGViewTests/w3c/1.2T/svg/text-text-09-t.svg)| -|❌|[text-tselect-03-t](SVGViewTests/w3c/1.2T/svg/text-tselect-03-t.svg)| -|❌|[text-ws-01-t](SVGViewTests/w3c/1.2T/svg/text-ws-01-t.svg)| -|❌|[text-ws-02-t](SVGViewTests/w3c/1.2T/svg/text-ws-02-t.svg)| +|❌|[text-align-01-t](Tests/SVGViewTests/w3c/1.2T/svg/text-align-01-t.svg)| +|❌|[text-align-07-t](Tests/SVGViewTests/w3c/1.2T/svg/text-align-07-t.svg)| +|❌|[text-align-08-t](Tests/SVGViewTests/w3c/1.2T/svg/text-align-08-t.svg)| +|❌|[text-align-201-t](Tests/SVGViewTests/w3c/1.2T/svg/text-align-201-t.svg)| +|❌|[text-align-202-t](Tests/SVGViewTests/w3c/1.2T/svg/text-align-202-t.svg)| +|❌|[text-align-203-t](Tests/SVGViewTests/w3c/1.2T/svg/text-align-203-t.svg)| +|❌|[text-align-204-t](Tests/SVGViewTests/w3c/1.2T/svg/text-align-204-t.svg)| +|❌|[text-area-201-t](Tests/SVGViewTests/w3c/1.2T/svg/text-area-201-t.svg)| +|❌|[text-area-202-t](Tests/SVGViewTests/w3c/1.2T/svg/text-area-202-t.svg)| +|❌|[text-area-203-t](Tests/SVGViewTests/w3c/1.2T/svg/text-area-203-t.svg)| +|❌|[text-area-204-t](Tests/SVGViewTests/w3c/1.2T/svg/text-area-204-t.svg)| +|❌|[text-area-205-t](Tests/SVGViewTests/w3c/1.2T/svg/text-area-205-t.svg)| +|❌|[text-area-206-t](Tests/SVGViewTests/w3c/1.2T/svg/text-area-206-t.svg)| +|❌|[text-area-207-t](Tests/SVGViewTests/w3c/1.2T/svg/text-area-207-t.svg)| +|❌|[text-area-208-t](Tests/SVGViewTests/w3c/1.2T/svg/text-area-208-t.svg)| +|❌|[text-area-209-t](Tests/SVGViewTests/w3c/1.2T/svg/text-area-209-t.svg)| +|❌|[text-area-210-t](Tests/SVGViewTests/w3c/1.2T/svg/text-area-210-t.svg)| +|❌|[text-area-211-t](Tests/SVGViewTests/w3c/1.2T/svg/text-area-211-t.svg)| +|❌|[text-area-212-t](Tests/SVGViewTests/w3c/1.2T/svg/text-area-212-t.svg)| +|❌|[text-area-213-t](Tests/SVGViewTests/w3c/1.2T/svg/text-area-213-t.svg)| +|❌|[text-area-220-t](Tests/SVGViewTests/w3c/1.2T/svg/text-area-220-t.svg)| +|❌|[text-area-221-t](Tests/SVGViewTests/w3c/1.2T/svg/text-area-221-t.svg)| +|❌|[text-area-222-t](Tests/SVGViewTests/w3c/1.2T/svg/text-area-222-t.svg)| +|❌|[text-area-223-t](Tests/SVGViewTests/w3c/1.2T/svg/text-area-223-t.svg)| +|❌|[text-area-224-t](Tests/SVGViewTests/w3c/1.2T/svg/text-area-224-t.svg)| +|❌|[text-area-225-t](Tests/SVGViewTests/w3c/1.2T/svg/text-area-225-t.svg)| +|❌|[text-edit-201-t](Tests/SVGViewTests/w3c/1.2T/svg/text-edit-201-t.svg)| +|❌|[text-fonts-01-t](Tests/SVGViewTests/w3c/1.2T/svg/text-fonts-01-t.svg)| +|❌|[text-fonts-02-t](Tests/SVGViewTests/w3c/1.2T/svg/text-fonts-02-t.svg)| +|❌|[text-fonts-03-t](Tests/SVGViewTests/w3c/1.2T/svg/text-fonts-03-t.svg)| +|❌|[text-fonts-04-t](Tests/SVGViewTests/w3c/1.2T/svg/text-fonts-04-t.svg)| +|❌|[text-fonts-202-t](Tests/SVGViewTests/w3c/1.2T/svg/text-fonts-202-t.svg)| +|❌|[text-fonts-203-t](Tests/SVGViewTests/w3c/1.2T/svg/text-fonts-203-t.svg)| +|❌|[text-intro-01-t](Tests/SVGViewTests/w3c/1.2T/svg/text-intro-01-t.svg)| +|❌|[text-intro-04-t](Tests/SVGViewTests/w3c/1.2T/svg/text-intro-04-t.svg)| +|❌|[text-intro-05-t](Tests/SVGViewTests/w3c/1.2T/svg/text-intro-05-t.svg)| +|❌|[text-intro-06-t](Tests/SVGViewTests/w3c/1.2T/svg/text-intro-06-t.svg)| +|❌|[text-intro-201-t](Tests/SVGViewTests/w3c/1.2T/svg/text-intro-201-t.svg)| +|❌|[text-layout-201-t](Tests/SVGViewTests/w3c/1.2T/svg/text-layout-201-t.svg)| +|❌|[text-text-04-t](Tests/SVGViewTests/w3c/1.2T/svg/text-text-04-t.svg)| +|❌|[text-text-05-t](Tests/SVGViewTests/w3c/1.2T/svg/text-text-05-t.svg)| +|❌|[text-text-06-t](Tests/SVGViewTests/w3c/1.2T/svg/text-text-06-t.svg)| +|❌|[text-text-07-t](Tests/SVGViewTests/w3c/1.2T/svg/text-text-07-t.svg)| +|❌|[text-text-08-t](Tests/SVGViewTests/w3c/1.2T/svg/text-text-08-t.svg)| +|❌|[text-text-09-t](Tests/SVGViewTests/w3c/1.2T/svg/text-text-09-t.svg)| +|❌|[text-tselect-03-t](Tests/SVGViewTests/w3c/1.2T/svg/text-tselect-03-t.svg)| +|❌|[text-ws-01-t](Tests/SVGViewTests/w3c/1.2T/svg/text-ws-01-t.svg)| +|❌|[text-ws-02-t](Tests/SVGViewTests/w3c/1.2T/svg/text-ws-02-t.svg)| ### [Types](https://www.w3.org/TR/SVGTiny12/types.html): `0.0%` @@ -1439,10 +1439,10 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[types-data-201-t](SVGViewTests/w3c/1.2T/svg/types-data-201-t.svg)| -|❌|[types-data-202-t](SVGViewTests/w3c/1.2T/svg/types-data-202-t.svg)| -|❌|[types-data-203-t](SVGViewTests/w3c/1.2T/svg/types-data-203-t.svg)| -|❌|[types-data-204-t](SVGViewTests/w3c/1.2T/svg/types-data-204-t.svg)| +|❌|[types-data-201-t](Tests/SVGViewTests/w3c/1.2T/svg/types-data-201-t.svg)| +|❌|[types-data-202-t](Tests/SVGViewTests/w3c/1.2T/svg/types-data-202-t.svg)| +|❌|[types-data-203-t](Tests/SVGViewTests/w3c/1.2T/svg/types-data-203-t.svg)| +|❌|[types-data-204-t](Tests/SVGViewTests/w3c/1.2T/svg/types-data-204-t.svg)| ### [Udom](https://www.w3.org/TR/SVGTiny12/udom.html): `0.0%` @@ -1452,118 +1452,118 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |Status | Name| |------|-------| -|❌|[udom-conform-201-t](SVGViewTests/w3c/1.2T/svg/udom-conform-201-t.svg)| -|❌|[udom-conform-202-t](SVGViewTests/w3c/1.2T/svg/udom-conform-202-t.svg)| -|❌|[udom-dom-201-t](SVGViewTests/w3c/1.2T/svg/udom-dom-201-t.svg)| -|❌|[udom-dom-202-t](SVGViewTests/w3c/1.2T/svg/udom-dom-202-t.svg)| -|❌|[udom-dom-203-t](SVGViewTests/w3c/1.2T/svg/udom-dom-203-t.svg)| -|❌|[udom-dom-204-t](SVGViewTests/w3c/1.2T/svg/udom-dom-204-t.svg)| -|❌|[udom-dom-205-t](SVGViewTests/w3c/1.2T/svg/udom-dom-205-t.svg)| -|❌|[udom-dom-206-t](SVGViewTests/w3c/1.2T/svg/udom-dom-206-t.svg)| -|❌|[udom-dom-207-t](SVGViewTests/w3c/1.2T/svg/udom-dom-207-t.svg)| -|❌|[udom-dom-208-t](SVGViewTests/w3c/1.2T/svg/udom-dom-208-t.svg)| -|❌|[udom-dom-209-t](SVGViewTests/w3c/1.2T/svg/udom-dom-209-t.svg)| -|❌|[udom-dom-210-t](SVGViewTests/w3c/1.2T/svg/udom-dom-210-t.svg)| -|❌|[udom-dom-211-t](SVGViewTests/w3c/1.2T/svg/udom-dom-211-t.svg)| -|❌|[udom-dom-212-t](SVGViewTests/w3c/1.2T/svg/udom-dom-212-t.svg)| -|❌|[udom-dom-213-t](SVGViewTests/w3c/1.2T/svg/udom-dom-213-t.svg)| -|❌|[udom-dom-215-t](SVGViewTests/w3c/1.2T/svg/udom-dom-215-t.svg)| -|❌|[udom-event-201-t](SVGViewTests/w3c/1.2T/svg/udom-event-201-t.svg)| -|❌|[udom-event-202-t](SVGViewTests/w3c/1.2T/svg/udom-event-202-t.svg)| -|❌|[udom-event-203-t](SVGViewTests/w3c/1.2T/svg/udom-event-203-t.svg)| -|❌|[udom-event-204-t](SVGViewTests/w3c/1.2T/svg/udom-event-204-t.svg)| -|❌|[udom-event-205-t](SVGViewTests/w3c/1.2T/svg/udom-event-205-t.svg)| -|❌|[udom-event-206-t](SVGViewTests/w3c/1.2T/svg/udom-event-206-t.svg)| -|❌|[udom-event-207-t](SVGViewTests/w3c/1.2T/svg/udom-event-207-t.svg)| -|❌|[udom-event-208-t](SVGViewTests/w3c/1.2T/svg/udom-event-208-t.svg)| -|❌|[udom-event-209-t](SVGViewTests/w3c/1.2T/svg/udom-event-209-t.svg)| -|❌|[udom-event-210-t](SVGViewTests/w3c/1.2T/svg/udom-event-210-t.svg)| -|❌|[udom-event-211-t](SVGViewTests/w3c/1.2T/svg/udom-event-211-t.svg)| -|❌|[udom-event-212-t](SVGViewTests/w3c/1.2T/svg/udom-event-212-t.svg)| -|❌|[udom-event-213-t](SVGViewTests/w3c/1.2T/svg/udom-event-213-t.svg)| -|❌|[udom-event-220-t](SVGViewTests/w3c/1.2T/svg/udom-event-220-t.svg)| -|❌|[udom-event-230-t](SVGViewTests/w3c/1.2T/svg/udom-event-230-t.svg)| -|❌|[udom-glob-202-t](SVGViewTests/w3c/1.2T/svg/udom-glob-202-t.svg)| -|❌|[udom-glob-203-t](SVGViewTests/w3c/1.2T/svg/udom-glob-203-t.svg)| -|❌|[udom-glob-204-t](SVGViewTests/w3c/1.2T/svg/udom-glob-204-t.svg)| -|❌|[udom-glob-205-t](SVGViewTests/w3c/1.2T/svg/udom-glob-205-t.svg)| -|❌|[udom-node-201-t](SVGViewTests/w3c/1.2T/svg/udom-node-201-t.svg)| -|❌|[udom-node-202-t](SVGViewTests/w3c/1.2T/svg/udom-node-202-t.svg)| -|❌|[udom-node-203-t](SVGViewTests/w3c/1.2T/svg/udom-node-203-t.svg)| -|❌|[udom-node-204-t](SVGViewTests/w3c/1.2T/svg/udom-node-204-t.svg)| -|❌|[udom-over-01-t](SVGViewTests/w3c/1.2T/svg/udom-over-01-t.svg)| -|❌|[udom-smil-201-t](SVGViewTests/w3c/1.2T/svg/udom-smil-201-t.svg)| -|❌|[udom-smil-202-t](SVGViewTests/w3c/1.2T/svg/udom-smil-202-t.svg)| -|❌|[udom-smil-203-t](SVGViewTests/w3c/1.2T/svg/udom-smil-203-t.svg)| -|❌|[udom-svg-201-t](SVGViewTests/w3c/1.2T/svg/udom-svg-201-t.svg)| -|❌|[udom-svg-202-t](SVGViewTests/w3c/1.2T/svg/udom-svg-202-t.svg)| -|❌|[udom-svg-203-t](SVGViewTests/w3c/1.2T/svg/udom-svg-203-t.svg)| -|❌|[udom-svg-204-t](SVGViewTests/w3c/1.2T/svg/udom-svg-204-t.svg)| -|❌|[udom-svg-205-t](SVGViewTests/w3c/1.2T/svg/udom-svg-205-t.svg)| -|❌|[udom-svg-206-t](SVGViewTests/w3c/1.2T/svg/udom-svg-206-t.svg)| -|❌|[udom-svg-207-t](SVGViewTests/w3c/1.2T/svg/udom-svg-207-t.svg)| -|❌|[udom-svg-208-t](SVGViewTests/w3c/1.2T/svg/udom-svg-208-t.svg)| -|❌|[udom-svg-209-t](SVGViewTests/w3c/1.2T/svg/udom-svg-209-t.svg)| -|❌|[udom-svg-210-t](SVGViewTests/w3c/1.2T/svg/udom-svg-210-t.svg)| -|❌|[udom-svg-211-t](SVGViewTests/w3c/1.2T/svg/udom-svg-211-t.svg)| -|❌|[udom-svg-212-t](SVGViewTests/w3c/1.2T/svg/udom-svg-212-t.svg)| -|❌|[udom-svg-213-t](SVGViewTests/w3c/1.2T/svg/udom-svg-213-t.svg)| -|❌|[udom-svg-216-t](SVGViewTests/w3c/1.2T/svg/udom-svg-216-t.svg)| -|❌|[udom-svg-217-t](SVGViewTests/w3c/1.2T/svg/udom-svg-217-t.svg)| -|❌|[udom-svg-218-t](SVGViewTests/w3c/1.2T/svg/udom-svg-218-t.svg)| -|❌|[udom-svg-219-t](SVGViewTests/w3c/1.2T/svg/udom-svg-219-t.svg)| -|❌|[udom-svg-220-t](SVGViewTests/w3c/1.2T/svg/udom-svg-220-t.svg)| -|❌|[udom-svg-221-t](SVGViewTests/w3c/1.2T/svg/udom-svg-221-t.svg)| -|❌|[udom-svg-222-t](SVGViewTests/w3c/1.2T/svg/udom-svg-222-t.svg)| -|❌|[udom-svg-223-t](SVGViewTests/w3c/1.2T/svg/udom-svg-223-t.svg)| -|❌|[udom-svg-224-t](SVGViewTests/w3c/1.2T/svg/udom-svg-224-t.svg)| -|❌|[udom-svg-225-t](SVGViewTests/w3c/1.2T/svg/udom-svg-225-t.svg)| -|❌|[udom-svg-226-t](SVGViewTests/w3c/1.2T/svg/udom-svg-226-t.svg)| -|❌|[udom-svg-227-t](SVGViewTests/w3c/1.2T/svg/udom-svg-227-t.svg)| -|❌|[udom-svg-228-t](SVGViewTests/w3c/1.2T/svg/udom-svg-228-t.svg)| -|❌|[udom-svg-229-t](SVGViewTests/w3c/1.2T/svg/udom-svg-229-t.svg)| -|❌|[udom-svg-230-t](SVGViewTests/w3c/1.2T/svg/udom-svg-230-t.svg)| -|❌|[udom-svg-231-t](SVGViewTests/w3c/1.2T/svg/udom-svg-231-t.svg)| -|❌|[udom-svg-232-t](SVGViewTests/w3c/1.2T/svg/udom-svg-232-t.svg)| -|❌|[udom-svg-233-t](SVGViewTests/w3c/1.2T/svg/udom-svg-233-t.svg)| -|❌|[udom-svg-234-t](SVGViewTests/w3c/1.2T/svg/udom-svg-234-t.svg)| -|❌|[udom-svg-235-t](SVGViewTests/w3c/1.2T/svg/udom-svg-235-t.svg)| -|❌|[udom-svg-236-t](SVGViewTests/w3c/1.2T/svg/udom-svg-236-t.svg)| -|❌|[udom-svg-237-t](SVGViewTests/w3c/1.2T/svg/udom-svg-237-t.svg)| -|❌|[udom-svg-238-t](SVGViewTests/w3c/1.2T/svg/udom-svg-238-t.svg)| -|❌|[udom-svg-239-t](SVGViewTests/w3c/1.2T/svg/udom-svg-239-t.svg)| -|❌|[udom-svg-240-t](SVGViewTests/w3c/1.2T/svg/udom-svg-240-t.svg)| -|❌|[udom-svg-241-t](SVGViewTests/w3c/1.2T/svg/udom-svg-241-t.svg)| -|❌|[udom-svgcolor-201-t](SVGViewTests/w3c/1.2T/svg/udom-svgcolor-201-t.svg)| -|❌|[udom-svglocatable-201-t](SVGViewTests/w3c/1.2T/svg/udom-svglocatable-201-t.svg)| -|❌|[udom-svglocatable-202-t](SVGViewTests/w3c/1.2T/svg/udom-svglocatable-202-t.svg)| -|❌|[udom-svglocatable-203-t](SVGViewTests/w3c/1.2T/svg/udom-svglocatable-203-t.svg)| -|❌|[udom-svglocatable-204-t](SVGViewTests/w3c/1.2T/svg/udom-svglocatable-204-t.svg)| -|❌|[udom-svgmatrix-201-t](SVGViewTests/w3c/1.2T/svg/udom-svgmatrix-201-t.svg)| -|❌|[udom-svgmatrix-202-t](SVGViewTests/w3c/1.2T/svg/udom-svgmatrix-202-t.svg)| -|❌|[udom-svgmatrix-203-t](SVGViewTests/w3c/1.2T/svg/udom-svgmatrix-203-t.svg)| -|❌|[udom-svgmatrix-204-t](SVGViewTests/w3c/1.2T/svg/udom-svgmatrix-204-t.svg)| -|❌|[udom-svgmatrix-205-t](SVGViewTests/w3c/1.2T/svg/udom-svgmatrix-205-t.svg)| -|❌|[udom-svgmatrix-206-t](SVGViewTests/w3c/1.2T/svg/udom-svgmatrix-206-t.svg)| -|❌|[udom-svgmatrix-207-t](SVGViewTests/w3c/1.2T/svg/udom-svgmatrix-207-t.svg)| -|❌|[udom-svgpath-201-t](SVGViewTests/w3c/1.2T/svg/udom-svgpath-201-t.svg)| -|❌|[udom-svgpath-202-t](SVGViewTests/w3c/1.2T/svg/udom-svgpath-202-t.svg)| -|❌|[udom-svgpoint-201-t](SVGViewTests/w3c/1.2T/svg/udom-svgpoint-201-t.svg)| -|❌|[udom-svgpoint-202-t](SVGViewTests/w3c/1.2T/svg/udom-svgpoint-202-t.svg)| -|❌|[udom-svgrect-201-t](SVGViewTests/w3c/1.2T/svg/udom-svgrect-201-t.svg)| -|❌|[udom-svgtimedelement-201-t](SVGViewTests/w3c/1.2T/svg/udom-svgtimedelement-201-t.svg)| -|❌|[udom-svgtimedelement-202-t](SVGViewTests/w3c/1.2T/svg/udom-svgtimedelement-202-t.svg)| -|❌|[udom-svgtimedelement-203-t](SVGViewTests/w3c/1.2T/svg/udom-svgtimedelement-203-t.svg)| -|❌|[udom-svgtimedelement-204-t](SVGViewTests/w3c/1.2T/svg/udom-svgtimedelement-204-t.svg)| -|❌|[udom-svgtimedelement-205-t](SVGViewTests/w3c/1.2T/svg/udom-svgtimedelement-205-t.svg)| -|❌|[udom-textcontent-201-t](SVGViewTests/w3c/1.2T/svg/udom-textcontent-201-t.svg)| -|❌|[udom-textcontent-202-t](SVGViewTests/w3c/1.2T/svg/udom-textcontent-202-t.svg)| -|❌|[udom-traitaccess-201-t](SVGViewTests/w3c/1.2T/svg/udom-traitaccess-201-t.svg)| -|❌|[udom-traitaccess-202-t](SVGViewTests/w3c/1.2T/svg/udom-traitaccess-202-t.svg)| -|❌|[udom-traitaccess-203-t](SVGViewTests/w3c/1.2T/svg/udom-traitaccess-203-t.svg)| -|❌|[udom-traitaccess-204-t](SVGViewTests/w3c/1.2T/svg/udom-traitaccess-204-t.svg)| -|❌|[udom-traitaccess-205-t](SVGViewTests/w3c/1.2T/svg/udom-traitaccess-205-t.svg)| -|❌|[udom-traitaccess-206-t](SVGViewTests/w3c/1.2T/svg/udom-traitaccess-206-t.svg)| -|❌|[udom-traitaccess-207-t](SVGViewTests/w3c/1.2T/svg/udom-traitaccess-207-t.svg)| +|❌|[udom-conform-201-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-conform-201-t.svg)| +|❌|[udom-conform-202-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-conform-202-t.svg)| +|❌|[udom-dom-201-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-dom-201-t.svg)| +|❌|[udom-dom-202-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-dom-202-t.svg)| +|❌|[udom-dom-203-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-dom-203-t.svg)| +|❌|[udom-dom-204-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-dom-204-t.svg)| +|❌|[udom-dom-205-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-dom-205-t.svg)| +|❌|[udom-dom-206-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-dom-206-t.svg)| +|❌|[udom-dom-207-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-dom-207-t.svg)| +|❌|[udom-dom-208-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-dom-208-t.svg)| +|❌|[udom-dom-209-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-dom-209-t.svg)| +|❌|[udom-dom-210-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-dom-210-t.svg)| +|❌|[udom-dom-211-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-dom-211-t.svg)| +|❌|[udom-dom-212-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-dom-212-t.svg)| +|❌|[udom-dom-213-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-dom-213-t.svg)| +|❌|[udom-dom-215-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-dom-215-t.svg)| +|❌|[udom-event-201-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-event-201-t.svg)| +|❌|[udom-event-202-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-event-202-t.svg)| +|❌|[udom-event-203-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-event-203-t.svg)| +|❌|[udom-event-204-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-event-204-t.svg)| +|❌|[udom-event-205-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-event-205-t.svg)| +|❌|[udom-event-206-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-event-206-t.svg)| +|❌|[udom-event-207-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-event-207-t.svg)| +|❌|[udom-event-208-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-event-208-t.svg)| +|❌|[udom-event-209-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-event-209-t.svg)| +|❌|[udom-event-210-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-event-210-t.svg)| +|❌|[udom-event-211-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-event-211-t.svg)| +|❌|[udom-event-212-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-event-212-t.svg)| +|❌|[udom-event-213-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-event-213-t.svg)| +|❌|[udom-event-220-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-event-220-t.svg)| +|❌|[udom-event-230-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-event-230-t.svg)| +|❌|[udom-glob-202-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-glob-202-t.svg)| +|❌|[udom-glob-203-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-glob-203-t.svg)| +|❌|[udom-glob-204-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-glob-204-t.svg)| +|❌|[udom-glob-205-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-glob-205-t.svg)| +|❌|[udom-node-201-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-node-201-t.svg)| +|❌|[udom-node-202-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-node-202-t.svg)| +|❌|[udom-node-203-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-node-203-t.svg)| +|❌|[udom-node-204-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-node-204-t.svg)| +|❌|[udom-over-01-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-over-01-t.svg)| +|❌|[udom-smil-201-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-smil-201-t.svg)| +|❌|[udom-smil-202-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-smil-202-t.svg)| +|❌|[udom-smil-203-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-smil-203-t.svg)| +|❌|[udom-svg-201-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-201-t.svg)| +|❌|[udom-svg-202-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-202-t.svg)| +|❌|[udom-svg-203-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-203-t.svg)| +|❌|[udom-svg-204-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-204-t.svg)| +|❌|[udom-svg-205-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-205-t.svg)| +|❌|[udom-svg-206-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-206-t.svg)| +|❌|[udom-svg-207-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-207-t.svg)| +|❌|[udom-svg-208-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-208-t.svg)| +|❌|[udom-svg-209-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-209-t.svg)| +|❌|[udom-svg-210-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-210-t.svg)| +|❌|[udom-svg-211-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-211-t.svg)| +|❌|[udom-svg-212-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-212-t.svg)| +|❌|[udom-svg-213-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-213-t.svg)| +|❌|[udom-svg-216-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-216-t.svg)| +|❌|[udom-svg-217-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-217-t.svg)| +|❌|[udom-svg-218-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-218-t.svg)| +|❌|[udom-svg-219-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-219-t.svg)| +|❌|[udom-svg-220-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-220-t.svg)| +|❌|[udom-svg-221-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-221-t.svg)| +|❌|[udom-svg-222-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-222-t.svg)| +|❌|[udom-svg-223-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-223-t.svg)| +|❌|[udom-svg-224-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-224-t.svg)| +|❌|[udom-svg-225-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-225-t.svg)| +|❌|[udom-svg-226-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-226-t.svg)| +|❌|[udom-svg-227-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-227-t.svg)| +|❌|[udom-svg-228-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-228-t.svg)| +|❌|[udom-svg-229-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-229-t.svg)| +|❌|[udom-svg-230-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-230-t.svg)| +|❌|[udom-svg-231-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-231-t.svg)| +|❌|[udom-svg-232-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-232-t.svg)| +|❌|[udom-svg-233-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-233-t.svg)| +|❌|[udom-svg-234-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-234-t.svg)| +|❌|[udom-svg-235-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-235-t.svg)| +|❌|[udom-svg-236-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-236-t.svg)| +|❌|[udom-svg-237-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-237-t.svg)| +|❌|[udom-svg-238-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-238-t.svg)| +|❌|[udom-svg-239-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-239-t.svg)| +|❌|[udom-svg-240-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-240-t.svg)| +|❌|[udom-svg-241-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svg-241-t.svg)| +|❌|[udom-svgcolor-201-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svgcolor-201-t.svg)| +|❌|[udom-svglocatable-201-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svglocatable-201-t.svg)| +|❌|[udom-svglocatable-202-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svglocatable-202-t.svg)| +|❌|[udom-svglocatable-203-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svglocatable-203-t.svg)| +|❌|[udom-svglocatable-204-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svglocatable-204-t.svg)| +|❌|[udom-svgmatrix-201-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svgmatrix-201-t.svg)| +|❌|[udom-svgmatrix-202-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svgmatrix-202-t.svg)| +|❌|[udom-svgmatrix-203-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svgmatrix-203-t.svg)| +|❌|[udom-svgmatrix-204-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svgmatrix-204-t.svg)| +|❌|[udom-svgmatrix-205-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svgmatrix-205-t.svg)| +|❌|[udom-svgmatrix-206-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svgmatrix-206-t.svg)| +|❌|[udom-svgmatrix-207-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svgmatrix-207-t.svg)| +|❌|[udom-svgpath-201-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svgpath-201-t.svg)| +|❌|[udom-svgpath-202-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svgpath-202-t.svg)| +|❌|[udom-svgpoint-201-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svgpoint-201-t.svg)| +|❌|[udom-svgpoint-202-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svgpoint-202-t.svg)| +|❌|[udom-svgrect-201-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svgrect-201-t.svg)| +|❌|[udom-svgtimedelement-201-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svgtimedelement-201-t.svg)| +|❌|[udom-svgtimedelement-202-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svgtimedelement-202-t.svg)| +|❌|[udom-svgtimedelement-203-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svgtimedelement-203-t.svg)| +|❌|[udom-svgtimedelement-204-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svgtimedelement-204-t.svg)| +|❌|[udom-svgtimedelement-205-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-svgtimedelement-205-t.svg)| +|❌|[udom-textcontent-201-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-textcontent-201-t.svg)| +|❌|[udom-textcontent-202-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-textcontent-202-t.svg)| +|❌|[udom-traitaccess-201-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-traitaccess-201-t.svg)| +|❌|[udom-traitaccess-202-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-traitaccess-202-t.svg)| +|❌|[udom-traitaccess-203-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-traitaccess-203-t.svg)| +|❌|[udom-traitaccess-204-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-traitaccess-204-t.svg)| +|❌|[udom-traitaccess-205-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-traitaccess-205-t.svg)| +|❌|[udom-traitaccess-206-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-traitaccess-206-t.svg)| +|❌|[udom-traitaccess-207-t](Tests/SVGViewTests/w3c/1.2T/svg/udom-traitaccess-207-t.svg)| From e1ff04d63957aae8e18c9a594045acd716f64cf0 Mon Sep 17 00:00:00 2001 From: Mathias Amnell <104110+Amnell@users.noreply.github.com> Date: Sun, 24 May 2026 13:56:25 +0200 Subject: [PATCH 10/19] Add generated png and source svg as test attachments to more easily debug --- Tests/SVGViewTests/BaseTestCase.swift | 49 +++++- Tests/SVGViewTests/SVG11Tests.swift | 208 ++++++++++++------------ Tests/SVGViewTests/SVG12Tests.swift | 56 +++---- Tests/SVGViewTests/SVGCustomTests.swift | 12 +- 4 files changed, 186 insertions(+), 139 deletions(-) diff --git a/Tests/SVGViewTests/BaseTestCase.swift b/Tests/SVGViewTests/BaseTestCase.swift index 2b3a4025..07362d10 100644 --- a/Tests/SVGViewTests/BaseTestCase.swift +++ b/Tests/SVGViewTests/BaseTestCase.swift @@ -9,6 +9,10 @@ import Foundation import Testing @testable import SVGView +#if canImport(SwiftUI) +import SwiftUI +#endif + protocol SVGTestHelper { var dir: String { get } } @@ -17,18 +21,21 @@ extension SVGTestHelper { var dir: String { "1.2T" } - func compareToReference(_ fileName: String) throws { + func compareToReference(_ fileName: String) async throws { let bundle = Bundle.module let svgURL = try #require(bundle.url(forResource: fileName, withExtension: "svg", subdirectory: "w3c/\(dir)/svg/")) let refURL = try #require(bundle.url(forResource: fileName, withExtension: "ref", subdirectory: "w3c/\(dir)/refs/")) + let svgSource = try String(contentsOf: svgURL) let node = try #require(SVGParser.parse(contentsOf: svgURL)) let content = Serializer.serialize(node) let reference = try String(contentsOf: refURL) + Attachment.record(Attachment(svgSource, named: "\(fileName).svg")) Attachment.record(Attachment(content, named: "\(fileName)-actual.txt")) Attachment.record(Attachment(reference, named: "\(fileName)-expected.txt")) Attachment.record(Attachment(unifiedDiff(actual: content, expected: reference), named: "\(fileName)-diff.txt")) + await renderedPNGAttachment(node: node, named: "\(fileName)-rendered.png") #expect(content == reference, "nodeContent is not equal to referenceContent. \(prettyFirstDifferenceBetweenStrings(s1: content, s2: reference))") } @@ -75,6 +82,46 @@ extension SVGTestHelper { } return result.reversed() } + + /// Renders `node` to a PNG using `ImageRenderer` and records it as a test attachment. + /// Only runs on platforms that support `ImageRenderer` (macOS 13+, iOS 16+, watchOS 9+). + /// Failures are silently ignored — the render is a diagnostic aid, not part of correctness. + func renderedPNGAttachment(node: SVGNode, named name: String) async { +#if canImport(SwiftUI) + if #available(macOS 13, iOS 16, watchOS 9, *) { + let size = renderSize(for: node) + let png = await MainActor.run { () -> Data? in + let renderer = ImageRenderer(content: SVGView(svg: node).frame(width: size.width, height: size.height)) + renderer.scale = 1.0 +#if os(macOS) + guard let nsImage = renderer.nsImage, + let tiff = nsImage.tiffRepresentation, + let rep = NSBitmapImageRep(data: tiff) else { return nil } + return rep.representation(using: .png, properties: [:]) +#elseif os(iOS) + return renderer.uiImage?.pngData() +#else + return nil +#endif + } + if let png { + Attachment.record(Attachment(png, named: name)) + } + } +#endif + } + + private func renderSize(for node: SVGNode) -> CGSize { + if let viewport = node as? SVGViewport { + if let box = viewport.viewBox, box.width > 0, box.height > 0 { + return CGSize(width: box.width, height: box.height) + } + if let w = viewport.width.ideal, let h = viewport.height.ideal, w > 0, h > 0 { + return CGSize(width: w, height: h) + } + } + return CGSize(width: 480, height: 360) + } } /// Find first differing character between two strings diff --git a/Tests/SVGViewTests/SVG11Tests.swift b/Tests/SVGViewTests/SVG11Tests.swift index 11d381c7..41756562 100644 --- a/Tests/SVGViewTests/SVG11Tests.swift +++ b/Tests/SVGViewTests/SVG11Tests.swift @@ -8,169 +8,169 @@ struct SVG11Tests { struct Color: SVGTestHelper { var dir: String { "1.1F2" } - @Test func colorProp01B() throws { try compareToReference("color-prop-01-b") } - @Test func colorProp02F() throws { try compareToReference("color-prop-02-f") } - @Test func colorProp03T() throws { try compareToReference("color-prop-03-t") } - @Test func colorProp04T() throws { try compareToReference("color-prop-04-t") } - @Test func colorProp05T() throws { try compareToReference("color-prop-05-t") } + @Test func colorProp01B() async throws { try await compareToReference("color-prop-01-b") } + @Test func colorProp02F() async throws { try await compareToReference("color-prop-02-f") } + @Test func colorProp03T() async throws { try await compareToReference("color-prop-03-t") } + @Test func colorProp04T() async throws { try await compareToReference("color-prop-04-t") } + @Test func colorProp05T() async throws { try await compareToReference("color-prop-05-t") } } @Suite("Coords") struct Coords: SVGTestHelper { var dir: String { "1.1F2" } - @Test func coordsCoord01T() throws { try compareToReference("coords-coord-01-t") } - @Test func coordsCoord02T() throws { try compareToReference("coords-coord-02-t") } - @Test func coordsTrans01B() throws { try compareToReference("coords-trans-01-b") } - @Test func coordsTrans02T() throws { try compareToReference("coords-trans-02-t") } - @Test func coordsTrans03T() throws { try compareToReference("coords-trans-03-t") } - @Test func coordsTrans04T() throws { try compareToReference("coords-trans-04-t") } - @Test func coordsTrans05T() throws { try compareToReference("coords-trans-05-t") } - @Test func coordsTrans06T() throws { try compareToReference("coords-trans-06-t") } - @Test func coordsTrans07T() throws { try compareToReference("coords-trans-07-t") } - @Test func coordsTrans08T() throws { try compareToReference("coords-trans-08-t") } - @Test func coordsTrans09T() throws { try compareToReference("coords-trans-09-t") } - @Test func coordsTrans10F() throws { try compareToReference("coords-trans-10-f") } - @Test func coordsTrans11F() throws { try compareToReference("coords-trans-11-f") } - @Test func coordsTrans12F() throws { try compareToReference("coords-trans-12-f") } - @Test func coordsTrans13F() throws { try compareToReference("coords-trans-13-f") } - @Test func coordsTrans14F() throws { try compareToReference("coords-trans-14-f") } - @Test func coordsTransformattr01F() throws { try compareToReference("coords-transformattr-01-f") } - @Test func coordsTransformattr02F() throws { try compareToReference("coords-transformattr-02-f") } - @Test func coordsTransformattr03F() throws { try compareToReference("coords-transformattr-03-f") } - @Test func coordsTransformattr04F() throws { try compareToReference("coords-transformattr-04-f") } - @Test func coordsTransformattr05F() throws { try compareToReference("coords-transformattr-05-f") } - @Test func coordsUnits02B() throws { try compareToReference("coords-units-02-b") } - @Test func coordsUnits03B() throws { try compareToReference("coords-units-03-b") } + @Test func coordsCoord01T() async throws { try await compareToReference("coords-coord-01-t") } + @Test func coordsCoord02T() async throws { try await compareToReference("coords-coord-02-t") } + @Test func coordsTrans01B() async throws { try await compareToReference("coords-trans-01-b") } + @Test func coordsTrans02T() async throws { try await compareToReference("coords-trans-02-t") } + @Test func coordsTrans03T() async throws { try await compareToReference("coords-trans-03-t") } + @Test func coordsTrans04T() async throws { try await compareToReference("coords-trans-04-t") } + @Test func coordsTrans05T() async throws { try await compareToReference("coords-trans-05-t") } + @Test func coordsTrans06T() async throws { try await compareToReference("coords-trans-06-t") } + @Test func coordsTrans07T() async throws { try await compareToReference("coords-trans-07-t") } + @Test func coordsTrans08T() async throws { try await compareToReference("coords-trans-08-t") } + @Test func coordsTrans09T() async throws { try await compareToReference("coords-trans-09-t") } + @Test func coordsTrans10F() async throws { try await compareToReference("coords-trans-10-f") } + @Test func coordsTrans11F() async throws { try await compareToReference("coords-trans-11-f") } + @Test func coordsTrans12F() async throws { try await compareToReference("coords-trans-12-f") } + @Test func coordsTrans13F() async throws { try await compareToReference("coords-trans-13-f") } + @Test func coordsTrans14F() async throws { try await compareToReference("coords-trans-14-f") } + @Test func coordsTransformattr01F() async throws { try await compareToReference("coords-transformattr-01-f") } + @Test func coordsTransformattr02F() async throws { try await compareToReference("coords-transformattr-02-f") } + @Test func coordsTransformattr03F() async throws { try await compareToReference("coords-transformattr-03-f") } + @Test func coordsTransformattr04F() async throws { try await compareToReference("coords-transformattr-04-f") } + @Test func coordsTransformattr05F() async throws { try await compareToReference("coords-transformattr-05-f") } + @Test func coordsUnits02B() async throws { try await compareToReference("coords-units-02-b") } + @Test func coordsUnits03B() async throws { try await compareToReference("coords-units-03-b") } } @Suite("Masking") struct Masking: SVGTestHelper { var dir: String { "1.1F2" } - @Test func maskingOpacity01B() throws { try compareToReference("masking-opacity-01-b") } + @Test func maskingOpacity01B() async throws { try await compareToReference("masking-opacity-01-b") } } @Suite("Painting") struct Painting: SVGTestHelper { var dir: String { "1.1F2" } - @Test func paintingControl02F() throws { try compareToReference("painting-control-02-f") } - @Test func paintingControl03F() throws { try compareToReference("painting-control-03-f") } - @Test func paintingFill01T() throws { try compareToReference("painting-fill-01-t") } - @Test func paintingFill02T() throws { try compareToReference("painting-fill-02-t") } - @Test func paintingFill03T() throws { try compareToReference("painting-fill-03-t") } - @Test func paintingFill04T() throws { try compareToReference("painting-fill-04-t") } - @Test func paintingFill05B() throws { try compareToReference("painting-fill-05-b") } - @Test func paintingMarker01F() throws { try compareToReference("painting-marker-01-f") } - @Test func paintingStroke01T() throws { try compareToReference("painting-stroke-01-t") } - @Test func paintingStroke02T() throws { try compareToReference("painting-stroke-02-t") } - @Test func paintingStroke03T() throws { try compareToReference("painting-stroke-03-t") } - @Test func paintingStroke04T() throws { try compareToReference("painting-stroke-04-t") } - @Test func paintingStroke05T() throws { try compareToReference("painting-stroke-05-t") } - @Test func paintingStroke07T() throws { try compareToReference("painting-stroke-07-t") } - @Test func paintingStroke08T() throws { try compareToReference("painting-stroke-08-t") } - @Test func paintingStroke09T() throws { try compareToReference("painting-stroke-09-t") } + @Test func paintingControl02F() async throws { try await compareToReference("painting-control-02-f") } + @Test func paintingControl03F() async throws { try await compareToReference("painting-control-03-f") } + @Test func paintingFill01T() async throws { try await compareToReference("painting-fill-01-t") } + @Test func paintingFill02T() async throws { try await compareToReference("painting-fill-02-t") } + @Test func paintingFill03T() async throws { try await compareToReference("painting-fill-03-t") } + @Test func paintingFill04T() async throws { try await compareToReference("painting-fill-04-t") } + @Test func paintingFill05B() async throws { try await compareToReference("painting-fill-05-b") } + @Test func paintingMarker01F() async throws { try await compareToReference("painting-marker-01-f") } + @Test func paintingStroke01T() async throws { try await compareToReference("painting-stroke-01-t") } + @Test func paintingStroke02T() async throws { try await compareToReference("painting-stroke-02-t") } + @Test func paintingStroke03T() async throws { try await compareToReference("painting-stroke-03-t") } + @Test func paintingStroke04T() async throws { try await compareToReference("painting-stroke-04-t") } + @Test func paintingStroke05T() async throws { try await compareToReference("painting-stroke-05-t") } + @Test func paintingStroke07T() async throws { try await compareToReference("painting-stroke-07-t") } + @Test func paintingStroke08T() async throws { try await compareToReference("painting-stroke-08-t") } + @Test func paintingStroke09T() async throws { try await compareToReference("painting-stroke-09-t") } } @Suite("Paths") struct Paths: SVGTestHelper { var dir: String { "1.1F2" } - @Test func pathsData01T() throws { try compareToReference("paths-data-01-t") } - @Test func pathsData02T() throws { try compareToReference("paths-data-02-t") } - @Test func pathsData03F() throws { try compareToReference("paths-data-03-f") } - @Test func pathsData04T() throws { try compareToReference("paths-data-04-t") } - @Test func pathsData05T() throws { try compareToReference("paths-data-05-t") } - @Test func pathsData06T() throws { try compareToReference("paths-data-06-t") } - @Test func pathsData07T() throws { try compareToReference("paths-data-07-t") } - @Test func pathsData08T() throws { try compareToReference("paths-data-08-t") } - @Test func pathsData09T() throws { try compareToReference("paths-data-09-t") } - @Test func pathsData10T() throws { try compareToReference("paths-data-10-t") } - @Test func pathsData12T() throws { try compareToReference("paths-data-12-t") } - @Test func pathsData13T() throws { try compareToReference("paths-data-13-t") } - @Test func pathsData14T() throws { try compareToReference("paths-data-14-t") } - @Test func pathsData15T() throws { try compareToReference("paths-data-15-t") } - @Test func pathsData16T() throws { try compareToReference("paths-data-16-t") } - @Test func pathsData17F() throws { try compareToReference("paths-data-17-f") } - @Test func pathsData18F() throws { try compareToReference("paths-data-18-f") } - @Test func pathsData19F() throws { try compareToReference("paths-data-19-f") } - @Test func pathsData20F() throws { try compareToReference("paths-data-20-f") } + @Test func pathsData01T() async throws { try await compareToReference("paths-data-01-t") } + @Test func pathsData02T() async throws { try await compareToReference("paths-data-02-t") } + @Test func pathsData03F() async throws { try await compareToReference("paths-data-03-f") } + @Test func pathsData04T() async throws { try await compareToReference("paths-data-04-t") } + @Test func pathsData05T() async throws { try await compareToReference("paths-data-05-t") } + @Test func pathsData06T() async throws { try await compareToReference("paths-data-06-t") } + @Test func pathsData07T() async throws { try await compareToReference("paths-data-07-t") } + @Test func pathsData08T() async throws { try await compareToReference("paths-data-08-t") } + @Test func pathsData09T() async throws { try await compareToReference("paths-data-09-t") } + @Test func pathsData10T() async throws { try await compareToReference("paths-data-10-t") } + @Test func pathsData12T() async throws { try await compareToReference("paths-data-12-t") } + @Test func pathsData13T() async throws { try await compareToReference("paths-data-13-t") } + @Test func pathsData14T() async throws { try await compareToReference("paths-data-14-t") } + @Test func pathsData15T() async throws { try await compareToReference("paths-data-15-t") } + @Test func pathsData16T() async throws { try await compareToReference("paths-data-16-t") } + @Test func pathsData17F() async throws { try await compareToReference("paths-data-17-f") } + @Test func pathsData18F() async throws { try await compareToReference("paths-data-18-f") } + @Test func pathsData19F() async throws { try await compareToReference("paths-data-19-f") } + @Test func pathsData20F() async throws { try await compareToReference("paths-data-20-f") } } @Suite("Pservers") struct Pservers: SVGTestHelper { var dir: String { "1.1F2" } - @Test func pserversGrad01B() throws { try compareToReference("pservers-grad-01-b") } - @Test func pserversGrad02B() throws { try compareToReference("pservers-grad-02-b") } - @Test func pserversGrad04B() throws { try compareToReference("pservers-grad-04-b") } - @Test func pserversGrad05B() throws { try compareToReference("pservers-grad-05-b") } - @Test func pserversGrad07B() throws { try compareToReference("pservers-grad-07-b") } - @Test func pserversGrad09B() throws { try compareToReference("pservers-grad-09-b") } + @Test func pserversGrad01B() async throws { try await compareToReference("pservers-grad-01-b") } + @Test func pserversGrad02B() async throws { try await compareToReference("pservers-grad-02-b") } + @Test func pserversGrad04B() async throws { try await compareToReference("pservers-grad-04-b") } + @Test func pserversGrad05B() async throws { try await compareToReference("pservers-grad-05-b") } + @Test func pserversGrad07B() async throws { try await compareToReference("pservers-grad-07-b") } + @Test func pserversGrad09B() async throws { try await compareToReference("pservers-grad-09-b") } } @Suite("Render") struct Render: SVGTestHelper { var dir: String { "1.1F2" } - @Test func renderElems01T() throws { try compareToReference("render-elems-01-t") } - @Test func renderElems02T() throws { try compareToReference("render-elems-02-t") } - @Test func renderElems03T() throws { try compareToReference("render-elems-03-t") } + @Test func renderElems01T() async throws { try await compareToReference("render-elems-01-t") } + @Test func renderElems02T() async throws { try await compareToReference("render-elems-02-t") } + @Test func renderElems03T() async throws { try await compareToReference("render-elems-03-t") } } @Suite("Shapes") struct Shapes: SVGTestHelper { var dir: String { "1.1F2" } - @Test func shapesCircle01T() throws { try compareToReference("shapes-circle-01-t") } - @Test func shapesCircle02T() throws { try compareToReference("shapes-circle-02-t") } - @Test func shapesEllipse01T() throws { try compareToReference("shapes-ellipse-01-t") } - @Test func shapesEllipse02T() throws { try compareToReference("shapes-ellipse-02-t") } - @Test func shapesEllipse03F() throws { try compareToReference("shapes-ellipse-03-f") } - @Test func shapesGrammar01F() throws { try compareToReference("shapes-grammar-01-f") } - @Test func shapesIntro01T() throws { try compareToReference("shapes-intro-01-t") } - @Test func shapesLine01T() throws { try compareToReference("shapes-line-01-t") } - @Test func shapesLine02F() throws { try compareToReference("shapes-line-02-f") } - @Test func shapesPolygon01T() throws { try compareToReference("shapes-polygon-01-t") } - @Test func shapesPolygon02T() throws { try compareToReference("shapes-polygon-02-t") } - @Test func shapesPolygon03T() throws { try compareToReference("shapes-polygon-03-t") } - @Test func shapesPolyline01T() throws { try compareToReference("shapes-polyline-01-t") } - @Test func shapesPolyline02T() throws { try compareToReference("shapes-polyline-02-t") } - @Test func shapesRect02T() throws { try compareToReference("shapes-rect-02-t") } - @Test func shapesRect04F() throws { try compareToReference("shapes-rect-04-f") } - @Test func shapesRect05F() throws { try compareToReference("shapes-rect-05-f") } - @Test func shapesRect06F() throws { try compareToReference("shapes-rect-06-f") } + @Test func shapesCircle01T() async throws { try await compareToReference("shapes-circle-01-t") } + @Test func shapesCircle02T() async throws { try await compareToReference("shapes-circle-02-t") } + @Test func shapesEllipse01T() async throws { try await compareToReference("shapes-ellipse-01-t") } + @Test func shapesEllipse02T() async throws { try await compareToReference("shapes-ellipse-02-t") } + @Test func shapesEllipse03F() async throws { try await compareToReference("shapes-ellipse-03-f") } + @Test func shapesGrammar01F() async throws { try await compareToReference("shapes-grammar-01-f") } + @Test func shapesIntro01T() async throws { try await compareToReference("shapes-intro-01-t") } + @Test func shapesLine01T() async throws { try await compareToReference("shapes-line-01-t") } + @Test func shapesLine02F() async throws { try await compareToReference("shapes-line-02-f") } + @Test func shapesPolygon01T() async throws { try await compareToReference("shapes-polygon-01-t") } + @Test func shapesPolygon02T() async throws { try await compareToReference("shapes-polygon-02-t") } + @Test func shapesPolygon03T() async throws { try await compareToReference("shapes-polygon-03-t") } + @Test func shapesPolyline01T() async throws { try await compareToReference("shapes-polyline-01-t") } + @Test func shapesPolyline02T() async throws { try await compareToReference("shapes-polyline-02-t") } + @Test func shapesRect02T() async throws { try await compareToReference("shapes-rect-02-t") } + @Test func shapesRect04F() async throws { try await compareToReference("shapes-rect-04-f") } + @Test func shapesRect05F() async throws { try await compareToReference("shapes-rect-05-f") } + @Test func shapesRect06F() async throws { try await compareToReference("shapes-rect-06-f") } } @Suite("Struct") struct Struct: SVGTestHelper { var dir: String { "1.1F2" } - @Test func structCond01T() throws { try compareToReference("struct-cond-01-t") } - @Test func structCond03T() throws { try compareToReference("struct-cond-03-t") } - @Test func structDefs01T() throws { try compareToReference("struct-defs-01-t") } - @Test func structFrag01T() throws { try compareToReference("struct-frag-01-t") } - @Test func structFrag06T() throws { try compareToReference("struct-frag-06-t") } - @Test func structGroup01T() throws { try compareToReference("struct-group-01-t") } - @Test func structImage01T() throws { try compareToReference("struct-image-01-t") } - @Test func structImage04T() throws { try compareToReference("struct-image-04-t") } - @Test func structUse03T() throws { try compareToReference("struct-use-03-t") } + @Test func structCond01T() async throws { try await compareToReference("struct-cond-01-t") } + @Test func structCond03T() async throws { try await compareToReference("struct-cond-03-t") } + @Test func structDefs01T() async throws { try await compareToReference("struct-defs-01-t") } + @Test func structFrag01T() async throws { try await compareToReference("struct-frag-01-t") } + @Test func structFrag06T() async throws { try await compareToReference("struct-frag-06-t") } + @Test func structGroup01T() async throws { try await compareToReference("struct-group-01-t") } + @Test func structImage01T() async throws { try await compareToReference("struct-image-01-t") } + @Test func structImage04T() async throws { try await compareToReference("struct-image-04-t") } + @Test func structUse03T() async throws { try await compareToReference("struct-use-03-t") } } @Suite("Styling") struct Styling: SVGTestHelper { var dir: String { "1.1F2" } - @Test func stylingClass01F() throws { try compareToReference("styling-class-01-f") } - @Test func stylingCss01B() throws { try compareToReference("styling-css-01-b") } - @Test func stylingPres01T() throws { try compareToReference("styling-pres-01-t") } + @Test func stylingClass01F() async throws { try await compareToReference("styling-class-01-f") } + @Test func stylingCss01B() async throws { try await compareToReference("styling-css-01-b") } + @Test func stylingPres01T() async throws { try await compareToReference("styling-pres-01-t") } } @Suite("Types") struct Types: SVGTestHelper { var dir: String { "1.1F2" } - @Test func typesBasic01F() throws { try compareToReference("types-basic-01-f") } + @Test func typesBasic01F() async throws { try await compareToReference("types-basic-01-f") } } } diff --git a/Tests/SVGViewTests/SVG12Tests.swift b/Tests/SVGViewTests/SVG12Tests.swift index 243b3454..070850ca 100644 --- a/Tests/SVGViewTests/SVG12Tests.swift +++ b/Tests/SVGViewTests/SVG12Tests.swift @@ -6,53 +6,53 @@ struct SVG12Tests { @Suite("Coords") struct Coords: SVGTestHelper { - @Test func coordsTrans01T() throws { try compareToReference("coords-trans-01-t") } - @Test func coordsTrans02T() throws { try compareToReference("coords-trans-02-t") } - @Test func coordsTrans03T() throws { try compareToReference("coords-trans-03-t") } - @Test func coordsTrans04T() throws { try compareToReference("coords-trans-04-t") } - @Test func coordsTrans05T() throws { try compareToReference("coords-trans-05-t") } - @Test func coordsTrans06T() throws { try compareToReference("coords-trans-06-t") } - @Test func coordsTrans07T() throws { try compareToReference("coords-trans-07-t") } - @Test func coordsTrans08T() throws { try compareToReference("coords-trans-08-t") } - @Test func coordsTrans09T() throws { try compareToReference("coords-trans-09-t") } + @Test func coordsTrans01T() async throws { try await compareToReference("coords-trans-01-t") } + @Test func coordsTrans02T() async throws { try await compareToReference("coords-trans-02-t") } + @Test func coordsTrans03T() async throws { try await compareToReference("coords-trans-03-t") } + @Test func coordsTrans04T() async throws { try await compareToReference("coords-trans-04-t") } + @Test func coordsTrans05T() async throws { try await compareToReference("coords-trans-05-t") } + @Test func coordsTrans06T() async throws { try await compareToReference("coords-trans-06-t") } + @Test func coordsTrans07T() async throws { try await compareToReference("coords-trans-07-t") } + @Test func coordsTrans08T() async throws { try await compareToReference("coords-trans-08-t") } + @Test func coordsTrans09T() async throws { try await compareToReference("coords-trans-09-t") } } @Suite("Paint") struct Paint: SVGTestHelper { - @Test func paintColor03T() throws { try compareToReference("paint-color-03-t") } - @Test func paintColor201T() throws { try compareToReference("paint-color-201-t") } - @Test func paintFill04T() throws { try compareToReference("paint-fill-04-t") } - @Test func paintFill06T() throws { try compareToReference("paint-fill-06-t") } - @Test func paintStroke01T() throws { try compareToReference("paint-stroke-01-t") } + @Test func paintColor03T() async throws { try await compareToReference("paint-color-03-t") } + @Test func paintColor201T() async throws { try await compareToReference("paint-color-201-t") } + @Test func paintFill04T() async throws { try await compareToReference("paint-fill-04-t") } + @Test func paintFill06T() async throws { try await compareToReference("paint-fill-06-t") } + @Test func paintStroke01T() async throws { try await compareToReference("paint-stroke-01-t") } } @Suite("Paths") struct Paths: SVGTestHelper { - @Test func pathsData01T() throws { try compareToReference("paths-data-01-t") } - @Test func pathsData02T() throws { try compareToReference("paths-data-02-t") } + @Test func pathsData01T() async throws { try await compareToReference("paths-data-01-t") } + @Test func pathsData02T() async throws { try await compareToReference("paths-data-02-t") } } @Suite("Render") struct Render: SVGTestHelper { - @Test func renderElems01T() throws { try compareToReference("render-elems-01-t") } - @Test func renderElems02T() throws { try compareToReference("render-elems-02-t") } - @Test func renderElems03T() throws { try compareToReference("render-elems-03-t") } + @Test func renderElems01T() async throws { try await compareToReference("render-elems-01-t") } + @Test func renderElems02T() async throws { try await compareToReference("render-elems-02-t") } + @Test func renderElems03T() async throws { try await compareToReference("render-elems-03-t") } } @Suite("Shapes") struct Shapes: SVGTestHelper { - @Test func shapesCircle01T() throws { try compareToReference("shapes-circle-01-t") } - @Test func shapesEllipse01T() throws { try compareToReference("shapes-ellipse-01-t") } - @Test func shapesLine01T() throws { try compareToReference("shapes-line-01-t") } - @Test func shapesPolygon01T() throws { try compareToReference("shapes-polygon-01-t") } - @Test func shapesPolyline01T() throws { try compareToReference("shapes-polyline-01-t") } - @Test func shapesRect02T() throws { try compareToReference("shapes-rect-02-t") } + @Test func shapesCircle01T() async throws { try await compareToReference("shapes-circle-01-t") } + @Test func shapesEllipse01T() async throws { try await compareToReference("shapes-ellipse-01-t") } + @Test func shapesLine01T() async throws { try await compareToReference("shapes-line-01-t") } + @Test func shapesPolygon01T() async throws { try await compareToReference("shapes-polygon-01-t") } + @Test func shapesPolyline01T() async throws { try await compareToReference("shapes-polyline-01-t") } + @Test func shapesRect02T() async throws { try await compareToReference("shapes-rect-02-t") } } @Suite("Struct") struct Struct: SVGTestHelper { - @Test func structDefs01T() throws { try compareToReference("struct-defs-01-t") } - @Test func structFrag01T() throws { try compareToReference("struct-frag-01-t") } - @Test func structUse03T() throws { try compareToReference("struct-use-03-t") } + @Test func structDefs01T() async throws { try await compareToReference("struct-defs-01-t") } + @Test func structFrag01T() async throws { try await compareToReference("struct-frag-01-t") } + @Test func structUse03T() async throws { try await compareToReference("struct-use-03-t") } } } diff --git a/Tests/SVGViewTests/SVGCustomTests.swift b/Tests/SVGViewTests/SVGCustomTests.swift index 4ccd1eea..dc454f19 100644 --- a/Tests/SVGViewTests/SVGCustomTests.swift +++ b/Tests/SVGViewTests/SVGCustomTests.swift @@ -9,16 +9,16 @@ struct SVGCustomTests: SVGTestHelper { "Custom" } - @Test func graph01() throws { - try compareToReference("graph-01") + @Test func graph01() async throws { + try await compareToReference("graph-01") } - @Test func viewport01() throws { - try compareToReference("viewport-01") + @Test func viewport01() async throws { + try await compareToReference("viewport-01") } - @Test func viewport02() throws { - try compareToReference("viewport-02") + @Test func viewport02() async throws { + try await compareToReference("viewport-02") } } \ No newline at end of file From 60ead7c011a4ff4a53d5b70e4d8ec0512f3cf95c Mon Sep 17 00:00:00 2001 From: Mathias Amnell <104110+Amnell@users.noreply.github.com> Date: Sun, 24 May 2026 15:22:23 +0200 Subject: [PATCH 11/19] Implement SVG pattern paint server with xlink:href inheritance (pservers-grad-03-b) - Add SVGPattern model (SVGPaint subclass) with CGBitmapContext tile rendering - Add draw(in: CGContext) to SVGNode (no-op), SVGRect, and SVGGroup - Add SVGParser.parseElements(_:index:) internal helper for pattern tile parsing - Register elements as paint servers in SVGIndex with xlink:href inheritance - Wire SVGPattern into SVGPaint.apply(paint:model:) switch - Add pserversGrad03B test and reference file --- GenerateReferencesCLI/cli.swift | 1 + Source/Model/Nodes/SVGGroup.swift | 11 +++ Source/Model/Nodes/SVGNode.swift | 6 ++ Source/Model/Primitives/SVGPaint.swift | 2 + Source/Model/Primitives/SVGPattern.swift | 77 +++++++++++++++++++ Source/Model/Shapes/SVGRect.swift | 17 +++- Source/Parser/SVG/SVGIndex.swift | 40 +++++++++- Source/Parser/SVG/SVGParser.swift | 12 +++ Tests/SVGViewTests/SVG11Tests.swift | 1 + .../w3c/1.1F2/refs/pservers-grad-03-b.ref | 46 +++++++++++ 10 files changed, 211 insertions(+), 2 deletions(-) create mode 100644 Source/Model/Primitives/SVGPattern.swift create mode 100644 Tests/SVGViewTests/w3c/1.1F2/refs/pservers-grad-03-b.ref diff --git a/GenerateReferencesCLI/cli.swift b/GenerateReferencesCLI/cli.swift index 770c4fba..203f4256 100644 --- a/GenerateReferencesCLI/cli.swift +++ b/GenerateReferencesCLI/cli.swift @@ -76,6 +76,7 @@ struct cli: ParsableCommand { "paths-data-20-f", "pservers-grad-01-b", "pservers-grad-02-b", + "pservers-grad-03-b", "pservers-grad-04-b", "pservers-grad-05-b", "pservers-grad-07-b", diff --git a/Source/Model/Nodes/SVGGroup.swift b/Source/Model/Nodes/SVGGroup.swift index ce143cc7..4fef4e1b 100644 --- a/Source/Model/Nodes/SVGGroup.swift +++ b/Source/Model/Nodes/SVGGroup.swift @@ -44,6 +44,17 @@ public class SVGGroup: SVGNode { serializer.add("contents", contents) } + #if !os(WASI) && !os(Linux) + override func draw(in context: CGContext) { + context.saveGState() + context.concatenate(transform) + for node in contents { + node.draw(in: context) + } + context.restoreGState() + } + #endif + #if canImport(SwiftUI) public func contentView() -> some View { SVGGroupView(model: self) diff --git a/Source/Model/Nodes/SVGNode.swift b/Source/Model/Nodes/SVGNode.swift index 1476a92c..f9602b4a 100644 --- a/Source/Model/Nodes/SVGNode.swift +++ b/Source/Model/Nodes/SVGNode.swift @@ -86,6 +86,12 @@ public class SVGNode: SerializableElement { return String(describing: type(of: self)) } + #if !os(WASI) && !os(Linux) + func draw(in context: CGContext) { + // default: no-op + } + #endif + } #if canImport(SwiftUI) diff --git a/Source/Model/Primitives/SVGPaint.swift b/Source/Model/Primitives/SVGPaint.swift index 19076133..8c775cc2 100644 --- a/Source/Model/Primitives/SVGPaint.swift +++ b/Source/Model/Primitives/SVGPaint.swift @@ -34,6 +34,8 @@ extension View { linearGradient.apply(view: self, model: model) case let radialGradient as SVGRadialGradient: radialGradient.apply(view: self, model: model) + case let pattern as SVGPattern: + pattern.apply(view: self, model: model) case let color as SVGColor: color.apply(view: self, model: model) default: diff --git a/Source/Model/Primitives/SVGPattern.swift b/Source/Model/Primitives/SVGPattern.swift new file mode 100644 index 00000000..378bdc92 --- /dev/null +++ b/Source/Model/Primitives/SVGPattern.swift @@ -0,0 +1,77 @@ +// +// SVGPattern.swift +// SVGView +// + +#if os(WASI) || os(Linux) +import Foundation +#else +import SwiftUI +#endif + +public class SVGPattern: SVGPaint { + + public let x: CGFloat + public let y: CGFloat + public let width: CGFloat + public let height: CGFloat + public let userSpace: Bool + public let patternTransform: CGAffineTransform + public let contents: [SVGNode] + + public init(x: CGFloat = 0, y: CGFloat = 0, width: CGFloat = 0, height: CGFloat = 0, + userSpace: Bool = true, patternTransform: CGAffineTransform = .identity, + contents: [SVGNode] = []) { + self.x = x + self.y = y + self.width = width + self.height = height + self.userSpace = userSpace + self.patternTransform = patternTransform + self.contents = contents + } + + #if canImport(SwiftUI) + @ViewBuilder + func apply(view: S, model: SVGShape? = nil) -> some View { + if width > 0, height > 0, !contents.isEmpty, let cgImage = renderTile() { + let image = Image(decorative: cgImage, scale: 1.0) + let bounds = model?.bounds() ?? .zero + view + .foregroundColor(.clear) + .overlay( + Rectangle() + .fill(ImagePaint(image: image, scale: 1.0)) + .frame(width: bounds.width, height: bounds.height) + .offset(x: bounds.minX, y: bounds.minY) + .mask(view) + ) + } else { + view.foregroundColor(.clear) + } + } + + private func renderTile() -> CGImage? { + let w = Int(ceil(width)) + let h = Int(ceil(height)) + guard w > 0, h > 0 else { return nil } + let colorSpace = CGColorSpaceCreateDeviceRGB() + guard let context = CGContext( + data: nil, + width: w, + height: h, + bitsPerComponent: 8, + bytesPerRow: 0, + space: colorSpace, + bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue + ) else { return nil } + // Flip coordinate system to match SVG (y increases downward) + context.translateBy(x: 0, y: CGFloat(h)) + context.scaleBy(x: 1, y: -1) + for node in contents { + node.draw(in: context) + } + return context.makeImage() + } + #endif +} diff --git a/Source/Model/Shapes/SVGRect.swift b/Source/Model/Shapes/SVGRect.swift index 0179896c..36cc6b8c 100644 --- a/Source/Model/Shapes/SVGRect.swift +++ b/Source/Model/Shapes/SVGRect.swift @@ -47,7 +47,22 @@ public class SVGRect: SVGShape { serializer.add("rx", rx, 0).add("ry", ry, 0) super.serialize(serializer) } - + + #if !os(WASI) && !os(Linux) + override func draw(in context: CGContext) { + guard let color = fill as? SVGColor else { return } + context.saveGState() + context.setFillColor(CGColor( + red: CGFloat(color.r) / 255, + green: CGFloat(color.g) / 255, + blue: CGFloat(color.b) / 255, + alpha: CGFloat(color.opacity) + )) + context.fill(CGRect(x: x, y: y, width: width, height: height)) + context.restoreGState() + } + #endif + #if canImport(SwiftUI) public func contentView() -> some View { SVGRectView(model: self) diff --git a/Source/Parser/SVG/SVGIndex.swift b/Source/Parser/SVG/SVGIndex.swift index b1a3d188..6c7f5ecd 100644 --- a/Source/Parser/SVG/SVGIndex.swift +++ b/Source/Parser/SVG/SVGIndex.swift @@ -37,7 +37,7 @@ class SVGIndex { if let id = SVGHelper.parseId(element.attributes) { elements[id] = element switch element.name { - case "linearGradient", "radialGradient", "fill": + case "linearGradient", "radialGradient", "fill", "pattern": paints[id] = parseFill(element) default: elements[id] = element @@ -60,11 +60,49 @@ class SVGIndex { return parseLinearGradient(element) case "radialGradient": return parseRadialGradient(element) + case "pattern": + return parsePattern(element) default: return .none } } + private func getParentPattern(_ element: XMLElement) -> SVGPattern? { + if let link = element.attributes["xlink:href"]?.replacingOccurrences(of: " ", with: ""), link.hasPrefix("#") { + let id = link.replacingOccurrences(of: "#", with: "") + return paints[id] as? SVGPattern + } + return nil + } + + private func parsePattern(_ element: XMLElement) -> SVGPattern? { + let parent = getParentPattern(element) + let childElements = element.contents.compactMap { $0 as? XMLElement } + let contents: [SVGNode] + if childElements.isEmpty { + contents = parent?.contents ?? [] + } else { + contents = SVGParser.parseElements(childElements, index: self) + } + guard !contents.isEmpty else { return nil } + let x = SVGHelper.parseCGFloat(element.attributes, "x", defaultValue: parent?.x ?? 0) + let y = SVGHelper.parseCGFloat(element.attributes, "y", defaultValue: parent?.y ?? 0) + let width = SVGHelper.parseCGFloat(element.attributes, "width", defaultValue: parent?.width ?? 0) + let height = SVGHelper.parseCGFloat(element.attributes, "height", defaultValue: parent?.height ?? 0) + guard width > 0, height > 0 else { return nil } + var userSpace = parent?.userSpace ?? false + if let patternUnits = element.attributes["patternUnits"] { + userSpace = patternUnits == "userSpaceOnUse" + } + var patternTransform = parent?.patternTransform ?? .identity + if let transformStr = element.attributes["patternTransform"] { + patternTransform = SVGHelper.parseTransform(transformStr) + } + return SVGPattern(x: x, y: y, width: width, height: height, + userSpace: userSpace, patternTransform: patternTransform, + contents: contents) + } + private func getParentGradient(_ element: XMLElement) -> SVGGradient? { if let link = element.attributes["xlink:href"]?.replacingOccurrences(of: " ", with: ""), link.hasPrefix("#") { diff --git a/Source/Parser/SVG/SVGParser.swift b/Source/Parser/SVG/SVGParser.swift index 74a72efb..e799d44f 100644 --- a/Source/Parser/SVG/SVGParser.swift +++ b/Source/Parser/SVG/SVGParser.swift @@ -50,6 +50,18 @@ public struct SVGParser { return parse(context: context) } + /// Parses a list of XML elements using the given index. Used for pattern tile content. + static func parseElements(_ elements: [XMLElement], index: SVGIndex) -> [SVGNode] { + let context = SVGRootContext( + logger: SVGLogger.console, + linker: SVGLinker.none, + screen: SVGScreen.main(ppi: 96), + index: index, + defaultFontSize: 16 + ) + return elements.compactMap { parse(element: $0, parentContext: context) } + } + private static let parsers: [String:SVGElementParser] = [ "svg": SVGViewportParser(), "g": SVGGroupParser(), diff --git a/Tests/SVGViewTests/SVG11Tests.swift b/Tests/SVGViewTests/SVG11Tests.swift index 41756562..77c6023e 100644 --- a/Tests/SVGViewTests/SVG11Tests.swift +++ b/Tests/SVGViewTests/SVG11Tests.swift @@ -104,6 +104,7 @@ struct SVG11Tests { @Test func pserversGrad01B() async throws { try await compareToReference("pservers-grad-01-b") } @Test func pserversGrad02B() async throws { try await compareToReference("pservers-grad-02-b") } + @Test func pserversGrad03B() async throws { try await compareToReference("pservers-grad-03-b") } @Test func pserversGrad04B() async throws { try await compareToReference("pservers-grad-04-b") } @Test func pserversGrad05B() async throws { try await compareToReference("pservers-grad-05-b") } @Test func pserversGrad07B() async throws { try await compareToReference("pservers-grad-07-b") } diff --git a/Tests/SVGViewTests/w3c/1.1F2/refs/pservers-grad-03-b.ref b/Tests/SVGViewTests/w3c/1.1F2/refs/pservers-grad-03-b.ref new file mode 100644 index 00000000..1a33c524 --- /dev/null +++ b/Tests/SVGViewTests/w3c/1.1F2/refs/pservers-grad-03-b.ref @@ -0,0 +1,46 @@ +SVGViewport { + id: "svg-root", + viewBox: { width: 480, height: 360 }, + scaling: "none", + contents: [ + SVGDefs { }, + SVGGroup { + id: "test-body-content", + contents: [ + SVGRect { x: 20, y: 20, width: 440, height: 80 }, + SVGText { + text: "Pattern fill.", + font: { name: "SVGFreeSansASCII,sans-serif", size: 30 }, + fill: "black", + transform: [1, 0, 0, 1, 20, 130] + }, + SVGRect { x: 20, y: 160, width: 440, height: 80 }, + SVGText { + text: "Referencing pattern fill below.", + font: { name: "SVGFreeSansASCII,sans-serif", size: 30 }, + fill: "black", + transform: [1, 0, 0, 1, 20, 270] + } + ] + }, + SVGGroup { + contents: [ + SVGText { + id: "revision", + text: "$Revision: 1.8 $", + font: { name: "SVGFreeSansASCII,sans-serif", size: 32 }, + fill: "black", + transform: [1, 0, 0, 1, 10, 340] + } + ] + }, + SVGRect { + id: "test-frame", + x: 1, + y: 1, + width: 478, + height: 358, + stroke: { fill: "black" } + } + ] +} From cf5cd1bbcd629e494f3c1fa1abf7a497b521167e Mon Sep 17 00:00:00 2001 From: Mathias Amnell <104110+Amnell@users.noreply.github.com> Date: Sun, 24 May 2026 15:26:38 +0200 Subject: [PATCH 12/19] Add AGENTS.md and architecture/feature reference docs --- .github/docs/architecture.md | 82 ++++++++++++++++++ .github/docs/implementing-features.md | 116 ++++++++++++++++++++++++++ AGENTS.md | 35 ++++++++ 3 files changed, 233 insertions(+) create mode 100644 .github/docs/architecture.md create mode 100644 .github/docs/implementing-features.md create mode 100644 AGENTS.md diff --git a/.github/docs/architecture.md b/.github/docs/architecture.md new file mode 100644 index 00000000..e2590169 --- /dev/null +++ b/.github/docs/architecture.md @@ -0,0 +1,82 @@ +# Architecture & Parsing Pipeline + +## Overview + +``` +SVGParser.parse(xml:) + │ + ├─ SVGIndex(element:) ← traverses full XML tree FIRST + │ ├─ elements[id] = XMLElement + │ ├─ paints[id] = SVGPaint ← linearGradient, radialGradient, pattern + │ └─ CSSParser ← + + +
+

SVGView Test Report

+
+ {passed} passed  /  + {failed} failed +   ({total} total) +
+
+ + + + +
+
+
+ +
+ {"".join(group_sections)} +
+
+ + +""" + +report_path = os.path.join(output_dir, "report.html") +with open(report_path, "w") as f: + f.write(html) + +print(f"Report written: {report_path}") +print(f" {passed}/{total} tests passing") +PYTHON_EOF + +echo "" +echo "Done. Opening report..." +open "$OUTPUT_DIR/report.html" From de67abc81a0fac3e2d68fa6a01289e2b7ae6c73a Mon Sep 17 00:00:00 2001 From: Mathias Amnell <104110+Amnell@users.noreply.github.com> Date: Sun, 24 May 2026 20:25:18 +0200 Subject: [PATCH 18/19] Update coverage --- w3c-coverage.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/w3c-coverage.md b/w3c-coverage.md index d3328f28..a1557ce2 100644 --- a/w3c-coverage.md +++ b/w3c-coverage.md @@ -2,7 +2,7 @@ This page is automatically generated and shows actual coverage of the [W3C SVG Test Suite](https://github.com/web-platform-tests/wpt/tree/master/svg) by this `SVGView` implementation. Currently there are two standards supported: [SVG 1.1 (Second Edition)](https://www.w3.org/TR/SVG11/) and [SVG Tiny 1.2](https://www.w3.org/TR/SVGTiny12/). - * [SVG 1.1 (Second Edition)](#svg-11-second-edition): `19.9%` + * [SVG 1.1 (Second Edition)](#svg-11-second-edition): `20.3%` * [Animate](#animate-1): `0.0%` * [Color](#color-1): `83.3%` * [Conform](#conform-1): `0.0%` @@ -17,7 +17,7 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T * [Metadata](#metadata-1): `0.0%` * [Painting](#painting-1): `51.6%` * [Paths](#paths-1): `90.4%` - * [Pservers](#pservers-1): `18.1%` + * [Pservers](#pservers-1): `24.2%` * [Render](#render-1): `37.5%` * [Script](#script-1): `0.0%` * [Shapes](#shapes-1): `81.8%` @@ -51,7 +51,7 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T ## [SVG 1.1 (Second Edition)](https://www.w3.org/TR/SVG11/) -`19.9%` of tests covered (104/522). They can be splitted into following categories: +`20.3%` of tests covered (106/522). They can be splitted into following categories: ### [Animate](https://www.w3.org/TR/SVG11/animate.html): `0.0%` @@ -468,19 +468,19 @@ This page is automatically generated and shows actual coverage of the [W3C SVG T |❌|[paths-dom-02-f](Tests/SVGViewTests/w3c/1.1F2/svg/paths-dom-02-f.svg)| -### [Pservers](https://www.w3.org/TR/SVG11/pservers.html): `18.1%` +### [Pservers](https://www.w3.org/TR/SVG11/pservers.html): `24.2%`
- (6/33) tests covered... + (8/33) tests covered... |Status | Name| |------|-------| |✅|[pservers-grad-01-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-01-b.svg)| |✅|[pservers-grad-02-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-02-b.svg)| -|❌|[pservers-grad-03-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-03-b.svg)| +|✅|[pservers-grad-03-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-03-b.svg)| |✅|[pservers-grad-04-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-04-b.svg)| |✅|[pservers-grad-05-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-05-b.svg)| -|❌|[pservers-grad-06-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-06-b.svg)| +|✅|[pservers-grad-06-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-06-b.svg)| |✅|[pservers-grad-07-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-07-b.svg)| |❌|[pservers-grad-08-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-08-b.svg)| |✅|[pservers-grad-09-b](Tests/SVGViewTests/w3c/1.1F2/svg/pservers-grad-09-b.svg)| From 29f26dcce364018a197c090d491288c895bbc804 Mon Sep 17 00:00:00 2001 From: Mathias Amnell <104110+Amnell@users.noreply.github.com> Date: Sun, 24 May 2026 20:45:09 +0200 Subject: [PATCH 19/19] Test report tool --- generate-test-report.py | 420 ++++++++++++++++++++++++++++++++++++++++ generate-test-report.sh | 277 +------------------------- 2 files changed, 423 insertions(+), 274 deletions(-) create mode 100644 generate-test-report.py diff --git a/generate-test-report.py b/generate-test-report.py new file mode 100644 index 00000000..a5d89622 --- /dev/null +++ b/generate-test-report.py @@ -0,0 +1,420 @@ +#!/usr/bin/env python3 +"""Generate an HTML test report from SVGView test output. + +Usage: python3 generate-test-report.py + + output_dir — directory written by `swift test --attachments-path` + project_dir — project root containing w3c-coverage.md +""" +import os +import re +import sys +from collections import defaultdict, OrderedDict + +output_dir = sys.argv[1] +project_dir = sys.argv[2] + +# ── Parse w3c-coverage.md ────────────────────────────────────────────────────── +# Builds: standards = OrderedDict of (std_label, version_dir) -> +# OrderedDict of suite_name -> [(passing:bool, test_name), ...] +coverage_path = os.path.join(project_dir, "w3c-coverage.md") +with open(coverage_path) as f: + cov_lines = f.readlines() + +standards = OrderedDict() # (label, dir) -> OrderedDict(suite -> [(bool, name)]) +current_std = None # (label, dir) tuple +current_suite = None + +for line in cov_lines: + s = line.strip() + # Top-level standard: ## [SVG 1.1 ...] or ## [SVG Tiny 1.2] + m = re.match(r'^## \[?(SVG [^\]\n]+?)\]?(?:\(.*?\))?\s*$', s) + if m: + title = m.group(1).strip() + current_std = ('SVG 1.1', '1.1F2') if '1.1' in title else ('SVG Tiny 1.2', '1.2T') + standards[current_std] = OrderedDict() + current_suite = None + continue + # Suite header: ### ... [SuiteName](...) + m = re.match(r'^###.*?\[(\w+)\]', s) + if m and current_std: + current_suite = m.group(1) + standards[current_std][current_suite] = [] + continue + # Test row: |✅| or |❌| + m = re.match(r'^\|([✅❌])\|\[([^\]]+)\]\(', s) + if m and current_std and current_suite: + standards[current_std][current_suite].append((m.group(1) == '✅', m.group(2))) + +# ── Build attachment lookup ──────────────────────────────────────────────────── +att = defaultdict(dict) # test_name -> {png, actual, expected, diff, svg_copy} +for fname in sorted(os.listdir(output_dir)): + for suffix, key in [('-rendered.png', 'png'), ('-actual.txt', 'actual'), + ('-expected.txt', 'expected'), ('-diff.txt', 'diff')]: + if fname.endswith(suffix): + att[fname[:-len(suffix)]][key] = fname + if fname.endswith('.svg'): + att[fname[:-4]]['svg_copy'] = fname + +def run_status(test_name): + """Return 'pass', 'fail', or 'unimplemented' based on attachments.""" + a = att.get(test_name, {}) + if 'png' not in a: + return 'unimplemented' + ap = os.path.join(output_dir, a.get('actual', '')) + ep = os.path.join(output_dir, a.get('expected', '')) + if os.path.exists(ap) and os.path.exists(ep): + with open(ap) as f: actual = f.read() + with open(ep) as f: expected = f.read() + return 'pass' if actual == expected else 'fail' + return 'fail' + +def svg_src(test_name, version_dir): + """Relative path from test-output/ to the original source SVG.""" + return f"../Tests/SVGViewTests/w3c/{version_dir}/svg/{test_name}.svg" + +def w3c_ref_url(test_name): + return f"https://www.w3.org/Graphics/SVG/Test/20110816/harness/htmlEmbed/{test_name}.html" + +# ── Aggregate stats ──────────────────────────────────────────────────────────── +total_pass = total_fail = total_unimpl = 0 +for (_, vdir), suites in standards.items(): + for suite, tests in suites.items(): + for _, name in tests: + s = run_status(name) + if s == 'pass': total_pass += 1 + elif s == 'fail': total_fail += 1 + else: total_unimpl += 1 +total = total_pass + total_fail + total_unimpl + +# ── Card HTML ───────────────────────────────────────────────────────────────── +STATUS_ICON = {'pass': '✅', 'fail': '❌', 'unimplemented': '🔲'} +STATUS_LABEL = {'pass': 'pass', 'fail': 'fail', 'unimplemented': 'unimplemented'} + +def img(src, cls='', alt=''): + return f'{alt}' + +def card_html(test_name, status, version_dir): + a = att.get(test_name, {}) + src_svg = svg_src(test_name, version_dir) + ref_url = w3c_ref_url(test_name) + + rendered_col = '' + if 'png' in a: + rendered_col = f'''
+
Rendered
+ {img(a["png"], alt="rendered")} +
''' + + source_col = f'''
+
Source SVG
+ {img(src_svg, alt="source svg")} +
''' + + ref_col = f'''''' + + diff_col = '' + if status == 'fail' and 'diff' in a: + diff_path = os.path.join(output_dir, a['diff']) + try: + with open(diff_path) as f: + diff_text = f.read(4000) + diff_col = f'''
+
Diff
+
{diff_text[:3000]}
+
''' + except Exception: + pass + + return f'''
+
+ {STATUS_ICON[status]} + {test_name} + {STATUS_LABEL[status]} + +
+
{rendered_col}{source_col}{ref_col}{diff_col}
+
''' + +# ── Build Standard > Suite sections + sidebar TOC ───────────────────────────── +std_sections_html = [] +toc_html = '' + +for (std_label, vdir), suites in standards.items(): + std_id = std_label.replace(' ', '-').lower() + suite_sections = [] + toc_suites = [] + + for suite, tests in suites.items(): + suite_id = f"{std_id}-{suite.lower()}" + s_pass = s_fail = s_unimpl = 0 + cards = [] + for _, name in tests: + s = run_status(name) + if s == 'pass': s_pass += 1 + elif s == 'fail': s_fail += 1 + else: s_unimpl += 1 + cards.append(card_html(name, s, vdir)) + + s_total = s_pass + s_fail + s_unimpl + badge_cls = ('suite-all-pass' if s_fail == 0 and s_unimpl == 0 else + 'suite-has-pass' if s_pass > 0 else 'suite-none') + + suite_sections.append(f''' +
+

+ {suite} + + {s_pass}✅ + {s_fail}❌ + {s_unimpl}🔲 + / {s_total} + +

+
{"".join(cards)}
+
''') + + toc_suites.append( + f'
  • ' + f'{suite} {s_pass}/{s_total}
  • ' + ) + + std_sections_html.append(f''' +
    +

    {std_label}

    + {"".join(suite_sections)} +
    ''') + + toc_html += f'''
  • {std_label} +
      {"".join(toc_suites)}
    +
  • ''' + +# ── Full HTML document ───────────────────────────────────────────────────────── +html = f""" + + + + + SVGView Test Report + + + +
    +

    SVGView Test Report

    +
    +
    {total_pass}Pass
    +
    {total_fail}Fail
    +
    {total_unimpl}Not impl.
    +
    {total}Total
    +
    +
    + + + + + +
    +
    +
    + +
    + {"".join(std_sections_html)} +
    +
    + + +""" + +report_path = os.path.join(output_dir, "report.html") +with open(report_path, "w") as f: + f.write(html) + +print(f" {total_pass} pass | {total_fail} fail | {total_unimpl} unimplemented | {total} total") +print(f"Report: {report_path}") diff --git a/generate-test-report.sh b/generate-test-report.sh index d9f531ab..d275f440 100755 --- a/generate-test-report.sh +++ b/generate-test-report.sh @@ -20,280 +20,9 @@ swift test --attachments-path "$OUTPUT_DIR" 2>&1 | tee "$OUTPUT_DIR/test-run.log # ── 3. Generate HTML report ─────────────────────────────────────────────────── echo "Generating report..." -python3 - "$OUTPUT_DIR" << 'PYTHON_EOF' -import os -import re -import sys -import glob - -output_dir = sys.argv[1] - -# ── Collect test entries ────────────────────────────────────────────────────── -# Each rendered PNG gives us one test entry. -rendered_pngs = sorted(glob.glob(os.path.join(output_dir, "*-rendered.png"))) - -tests = [] -for png_path in rendered_pngs: - png_name = os.path.basename(png_path) # e.g. color-prop-01-b-rendered.png - test_name = png_name[:-len("-rendered.png")] # e.g. color-prop-01-b - - # Derive group from the first two dash-separated words, e.g. "color-prop" - parts = test_name.split("-") - group = "-".join(parts[:2]) if len(parts) >= 2 else test_name - - # Determine pass/fail by comparing actual vs expected serialisation - actual_path = os.path.join(output_dir, f"{test_name}-actual.txt") - expected_path = os.path.join(output_dir, f"{test_name}-expected.txt") - passed = False - if os.path.exists(actual_path) and os.path.exists(expected_path): - with open(actual_path) as f: actual = f.read() - with open(expected_path) as f: expected = f.read() - passed = (actual == expected) - - # The SVG source is also saved as an attachment - svg_filename = f"{test_name}.svg" - svg_path = os.path.join(output_dir, svg_filename) - has_svg = os.path.exists(svg_path) - - tests.append({ - "name": test_name, - "group": group, - "png": png_name, - "svg": svg_filename if has_svg else None, - "passed": passed, - "has_actual": os.path.exists(actual_path), - }) - -total = len(tests) -passed = sum(1 for t in tests if t["passed"]) -failed = total - passed - -# ── Group for TOC ───────────────────────────────────────────────────────────── -from collections import defaultdict -groups = defaultdict(list) -for t in tests: - groups[t["group"]].append(t) - -# ── Build HTML ──────────────────────────────────────────────────────────────── -def test_cards(test_list): - cards = [] - for t in test_list: - status_cls = "pass" if t["passed"] else "fail" - status_icon = "✅" if t["passed"] else "❌" - - svg_col = "" - if t["svg"]: - svg_col = f'
    Source SVG
    source svg
    ' - else: - svg_col = '
    Source SVG
    not available
    ' - - png_col = f'
    Rendered PNG
    rendered png
    ' - - cards.append(f''' -
    -
    - {status_icon} - {t["name"]} -
    -
    - {svg_col} - {png_col} -
    -
    ''') - return "\n".join(cards) - -group_sections = [] -for group_name, group_tests in sorted(groups.items()): - gpass = sum(1 for t in group_tests if t["passed"]) - gtotal = len(group_tests) - group_sections.append(f''' -
    -

    {group_name} {gpass}/{gtotal}

    - {test_cards(group_tests)} -
    ''') - -toc_items = "".join( - f'
  • {g} ({sum(1 for t in ts if t["passed"])}/{len(ts)})
  • ' - for g, ts in sorted(groups.items()) -) - -html = f""" - - - - - SVGView Test Report - - - -
    -

    SVGView Test Report

    -
    - {passed} passed  /  - {failed} failed -   ({total} total) -
    -
    - - - - -
    -
    -
    - -
    - {"".join(group_sections)} -
    -
    - - -""" - -report_path = os.path.join(output_dir, "report.html") -with open(report_path, "w") as f: - f.write(html) - -print(f"Report written: {report_path}") -print(f" {passed}/{total} tests passing") -PYTHON_EOF +python3 "$SCRIPT_DIR/generate-test-report.py" "$OUTPUT_DIR" "$SCRIPT_DIR" echo "" -echo "Done. Opening report..." +echo "Opening report..." open "$OUTPUT_DIR/report.html" +