123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519 |
- // Copyright 2008 The Closure Library Authors. All Rights Reserved.
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS-IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- goog.provide('goog.math.PathTest');
- goog.require('goog.array');
- goog.require('goog.math.AffineTransform');
- goog.require('goog.math.Path');
- goog.require('goog.testing.jsunit');
- goog.setTestOnly('goog.math.PathTest');
- /**
- * Array mapping numeric segment constant to a descriptive character.
- * @type {!Array<string>}
- * @private
- */
- var SEGMENT_NAMES_ = function() {
- var arr = [];
- arr[goog.math.Path.Segment.MOVETO] = 'M';
- arr[goog.math.Path.Segment.LINETO] = 'L';
- arr[goog.math.Path.Segment.CURVETO] = 'C';
- arr[goog.math.Path.Segment.ARCTO] = 'A';
- arr[goog.math.Path.Segment.CLOSE] = 'X';
- return arr;
- }();
- /**
- * Test if the given path matches the expected array of commands and parameters.
- * @param {Array<string|number>} expected The expected array of commands and
- * parameters.
- * @param {goog.math.Path} path The path to test against.
- */
- var assertPathEquals = function(expected, path) {
- var actual = [];
- path.forEachSegment(function(seg, args) {
- actual.push(SEGMENT_NAMES_[seg]);
- Array.prototype.push.apply(actual, args);
- });
- assertEquals(expected.length, actual.length);
- for (var i = 0; i < expected.length; i++) {
- if (goog.isNumber(expected[i])) {
- assertTrue(goog.isNumber(actual[i]));
- assertRoughlyEquals(expected[i], actual[i], 0.01);
- } else {
- assertEquals(expected[i], actual[i]);
- }
- }
- };
- function testConstructor() {
- var path = new goog.math.Path();
- assertTrue(path.isSimple());
- assertNull(path.getCurrentPoint());
- assertPathEquals([], path);
- }
- function testGetSegmentCount() {
- assertArrayEquals(
- [2, 2, 6, 6, 0],
- goog.array.map(
- [
- goog.math.Path.Segment.MOVETO, goog.math.Path.Segment.LINETO,
- goog.math.Path.Segment.CURVETO, goog.math.Path.Segment.ARCTO,
- goog.math.Path.Segment.CLOSE
- ],
- goog.math.Path.getSegmentCount));
- }
- function testSimpleMoveTo() {
- var path = new goog.math.Path();
- path.moveTo(30, 50);
- assertTrue(path.isSimple());
- assertObjectEquals([30, 50], path.getCurrentPoint());
- assertPathEquals(['M', 30, 50], path);
- }
- function testRepeatedMoveTo() {
- var path = new goog.math.Path();
- path.moveTo(30, 50);
- path.moveTo(40, 60);
- assertTrue(path.isSimple());
- assertObjectEquals([40, 60], path.getCurrentPoint());
- assertPathEquals(['M', 40, 60], path);
- }
- function testSimpleLineTo_fromArgs() {
- var path = new goog.math.Path();
- var e = assertThrows(function() { path.lineTo(30, 50); });
- assertEquals('Path cannot start with lineTo', e.message);
- path.moveTo(0, 0);
- path.lineTo(30, 50);
- assertTrue(path.isSimple());
- assertObjectEquals([30, 50], path.getCurrentPoint());
- assertPathEquals(['M', 0, 0, 'L', 30, 50], path);
- }
- function testSimpleLineTo_fromArray() {
- var path = new goog.math.Path();
- var e = assertThrows(function() { path.lineToFromArray([30, 50]); });
- assertEquals('Path cannot start with lineTo', e.message);
- path.moveTo(0, 0);
- path.lineToFromArray([30, 50]);
- assertTrue(path.isSimple());
- assertObjectEquals([30, 50], path.getCurrentPoint());
- assertPathEquals(['M', 0, 0, 'L', 30, 50], path);
- }
- function testMultiArgLineTo_fromArgs() {
- var path = new goog.math.Path();
- path.moveTo(0, 0);
- path.lineTo(30, 50, 40, 60);
- assertTrue(path.isSimple());
- assertObjectEquals([40, 60], path.getCurrentPoint());
- assertPathEquals(['M', 0, 0, 'L', 30, 50, 40, 60], path);
- }
- function testMultiArgLineTo_fromArray() {
- var path = new goog.math.Path();
- path.moveTo(0, 0);
- path.lineToFromArray([30, 50, 40, 60]);
- assertTrue(path.isSimple());
- assertObjectEquals([40, 60], path.getCurrentPoint());
- assertPathEquals(['M', 0, 0, 'L', 30, 50, 40, 60], path);
- }
- function testRepeatedLineTo_fromArgs() {
- var path = new goog.math.Path();
- path.moveTo(0, 0);
- path.lineTo(30, 50);
- path.lineTo(40, 60);
- assertTrue(path.isSimple());
- assertObjectEquals([40, 60], path.getCurrentPoint());
- assertPathEquals(['M', 0, 0, 'L', 30, 50, 40, 60], path);
- }
- function testRepeatedLineTo_fromArray() {
- var path = new goog.math.Path();
- path.moveTo(0, 0);
- path.lineToFromArray([30, 50]);
- path.lineToFromArray([40, 60]);
- assertTrue(path.isSimple());
- assertObjectEquals([40, 60], path.getCurrentPoint());
- assertPathEquals(['M', 0, 0, 'L', 30, 50, 40, 60], path);
- }
- function testSimpleCurveTo_fromArgs() {
- var path = new goog.math.Path();
- var e = assertThrows(function() { path.curveTo(10, 20, 30, 40, 50, 60); });
- assertEquals('Path cannot start with curve', e.message);
- path.moveTo(0, 0);
- path.curveTo(10, 20, 30, 40, 50, 60);
- assertTrue(path.isSimple());
- assertObjectEquals([50, 60], path.getCurrentPoint());
- assertPathEquals(['M', 0, 0, 'C', 10, 20, 30, 40, 50, 60], path);
- }
- function testSimpleCurveTo_fromArray() {
- var path = new goog.math.Path();
- var e = assertThrows(function() {
- path.curveToFromArray([10, 20, 30, 40, 50, 60]);
- });
- assertEquals('Path cannot start with curve', e.message);
- path.moveTo(0, 0);
- path.curveToFromArray([10, 20, 30, 40, 50, 60]);
- assertTrue(path.isSimple());
- assertObjectEquals([50, 60], path.getCurrentPoint());
- assertPathEquals(['M', 0, 0, 'C', 10, 20, 30, 40, 50, 60], path);
- }
- function testMultiCurveTo_fromArgs() {
- var path = new goog.math.Path();
- path.moveTo(0, 0);
- path.curveTo(10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120);
- assertTrue(path.isSimple());
- assertObjectEquals([110, 120], path.getCurrentPoint());
- assertPathEquals(
- ['M', 0, 0, 'C', 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120],
- path);
- }
- function testMultiCurveTo_fromArray() {
- var path = new goog.math.Path();
- path.moveTo(0, 0);
- path.curveToFromArray([10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120]);
- assertTrue(path.isSimple());
- assertObjectEquals([110, 120], path.getCurrentPoint());
- assertPathEquals(
- ['M', 0, 0, 'C', 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120],
- path);
- }
- function testRepeatedCurveTo_fromArgs() {
- var path = new goog.math.Path();
- path.moveTo(0, 0);
- path.curveTo(10, 20, 30, 40, 50, 60);
- path.curveTo(70, 80, 90, 100, 110, 120);
- assertTrue(path.isSimple());
- assertObjectEquals([110, 120], path.getCurrentPoint());
- assertPathEquals(
- ['M', 0, 0, 'C', 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120],
- path);
- }
- function testRepeatedCurveTo_fromArray() {
- var path = new goog.math.Path();
- path.moveTo(0, 0);
- path.curveToFromArray([10, 20, 30, 40, 50, 60]);
- path.curveToFromArray([70, 80, 90, 100, 110, 120]);
- assertTrue(path.isSimple());
- assertObjectEquals([110, 120], path.getCurrentPoint());
- assertPathEquals(
- ['M', 0, 0, 'C', 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120],
- path);
- }
- function testSimpleArc() {
- var path = new goog.math.Path();
- path.arc(50, 60, 10, 20, 30, 30, false);
- assertFalse(path.isSimple());
- var p = path.getCurrentPoint();
- assertEquals(55, p[0]);
- assertRoughlyEquals(77.32, p[1], 0.01);
- assertPathEquals(['M', 58.66, 70, 'A', 10, 20, 30, 30, 55, 77.32], path);
- }
- function testArcNonConnectClose() {
- var path = new goog.math.Path();
- path.moveTo(0, 0);
- path.arc(10, 10, 10, 10, -90, 180, false);
- assertObjectEquals([10, 20], path.getCurrentPoint());
- path.close();
- assertObjectEquals([10, 0], path.getCurrentPoint());
- }
- function testRepeatedArc() {
- var path = new goog.math.Path();
- path.arc(50, 60, 10, 20, 30, 30, false);
- path.arc(50, 60, 10, 20, 60, 30, false);
- assertFalse(path.isSimple());
- assertObjectEquals([50, 80], path.getCurrentPoint());
- assertPathEquals(
- [
- 'M', 58.66, 70, 'A', 10, 20, 30, 30, 55, 77.32,
- 'M', 55, 77.32, 'A', 10, 20, 60, 30, 50, 80
- ],
- path);
- }
- function testRepeatedArc2() {
- var path = new goog.math.Path();
- path.arc(50, 60, 10, 20, 30, 30, false);
- path.arc(50, 60, 10, 20, 60, 30, true);
- assertPathEquals(
- [
- 'M', 58.66, 70, 'A', 10, 20, 30, 30, 55, 77.32, 'A', 10, 20, 60, 30, 50,
- 80
- ],
- path);
- }
- function testCompleteCircle() {
- var path = new goog.math.Path();
- path.arc(0, 0, 10, 10, 0, 360, false);
- assertFalse(path.isSimple());
- var p = path.getCurrentPoint();
- assertRoughlyEquals(10, p[0], 0.01);
- assertRoughlyEquals(0, p[1], 0.01);
- assertPathEquals(['M', 10, 0, 'A', 10, 10, 0, 360, 10, 0], path);
- }
- function testClose() {
- var path = new goog.math.Path();
- assertThrows('Path cannot start with close', function() { path.close(); });
- path.moveTo(0, 0);
- path.lineTo(10, 20, 30, 40, 50, 60);
- path.close();
- assertTrue(path.isSimple());
- assertObjectEquals([0, 0], path.getCurrentPoint());
- assertPathEquals(['M', 0, 0, 'L', 10, 20, 30, 40, 50, 60, 'X'], path);
- }
- function testClear() {
- var path = new goog.math.Path();
- path.moveTo(0, 0);
- path.arc(50, 60, 10, 20, 30, 30, false);
- path.clear();
- assertTrue(path.isSimple());
- assertNull(path.getCurrentPoint());
- assertPathEquals([], path);
- }
- function testCreateSimplifiedPath() {
- var path = new goog.math.Path();
- path.moveTo(0, 0);
- path.arc(50, 60, 10, 20, 30, 30, false);
- assertFalse(path.isSimple());
- path = goog.math.Path.createSimplifiedPath(path);
- assertTrue(path.isSimple());
- var p = path.getCurrentPoint();
- assertEquals(55, p[0]);
- assertRoughlyEquals(77.32, p[1], 0.01);
- assertPathEquals(
- ['M', 58.66, 70, 'C', 57.78, 73.04, 56.52, 75.57, 55, 77.32], path);
- }
- function testCreateSimplifiedPath2() {
- var path = new goog.math.Path();
- path.arc(50, 60, 10, 20, 30, 30, false);
- path.arc(50, 60, 10, 20, 60, 30, false);
- assertFalse(path.isSimple());
- path = goog.math.Path.createSimplifiedPath(path);
- assertTrue(path.isSimple());
- assertPathEquals(
- [
- 'M', 58.66, 70, 'C', 57.78, 73.04, 56.52, 75.57, 55, 77.32,
- 'M', 55, 77.32, 'C', 53.48, 79.08, 51.76, 80, 50, 80
- ],
- path);
- }
- function testCreateSimplifiedPath3() {
- var path = new goog.math.Path();
- path.arc(50, 60, 10, 20, 30, 30, false);
- path.arc(50, 60, 10, 20, 60, 30, true);
- path.close();
- path = goog.math.Path.createSimplifiedPath(path);
- assertPathEquals(
- [
- 'M', 58.66, 70, 'C', 57.78, 73.04, 56.52, 75.57, 55, 77.32, 53.48,
- 79.08, 51.76, 80, 50, 80, 'X'
- ],
- path);
- var p = path.getCurrentPoint();
- assertRoughlyEquals(58.66, p[0], 0.01);
- assertRoughlyEquals(70, p[1], 0.01);
- }
- function testArcToAsCurves() {
- var path = new goog.math.Path();
- path.moveTo(58.66, 70);
- path.arcToAsCurves(10, 20, 30, 30);
- assertPathEquals(
- ['M', 58.66, 70, 'C', 57.78, 73.04, 56.52, 75.57, 55, 77.32], path);
- }
- function testCreateTransformedPath() {
- var path = new goog.math.Path();
- path.moveTo(0, 0);
- path.lineTo(0, 10, 10, 10, 10, 0);
- path.close();
- var tx = new goog.math.AffineTransform(2, 0, 0, 3, 10, 20);
- var path2 = path.createTransformedPath(tx);
- assertPathEquals(['M', 0, 0, 'L', 0, 10, 10, 10, 10, 0, 'X'], path);
- assertPathEquals(['M', 10, 20, 'L', 10, 50, 30, 50, 30, 20, 'X'], path2);
- }
- function testTransform() {
- var path = new goog.math.Path();
- path.moveTo(0, 0);
- path.lineTo(0, 10, 10, 10, 10, 0);
- path.close();
- var tx = new goog.math.AffineTransform(2, 0, 0, 3, 10, 20);
- var path2 = path.transform(tx);
- assertTrue(path === path2);
- assertPathEquals(['M', 10, 20, 'L', 10, 50, 30, 50, 30, 20, 'X'], path2);
- }
- function testTransformCurrentAndClosePoints() {
- var path = new goog.math.Path();
- path.moveTo(0, 0);
- assertObjectEquals([0, 0], path.getCurrentPoint());
- path.transform(new goog.math.AffineTransform(1, 0, 0, 1, 10, 20));
- assertObjectEquals([10, 20], path.getCurrentPoint());
- path.lineTo(50, 50);
- path.close();
- assertObjectEquals([10, 20], path.getCurrentPoint());
- }
- function testTransformNonSimple() {
- var path = new goog.math.Path();
- path.arc(50, 60, 10, 20, 30, 30, false);
- assertThrows(function() {
- path.transform(new goog.math.AffineTransform(1, 0, 0, 1, 10, 20));
- });
- }
- function testAppendPath() {
- var path1 = new goog.math.Path();
- path1.moveTo(0, 0);
- path1.lineTo(0, 10, 10, 10, 10, 0);
- path1.close();
- var path2 = new goog.math.Path();
- path2.arc(50, 60, 10, 20, 30, 30, false);
- assertTrue(path1.isSimple());
- path1.appendPath(path2);
- assertFalse(path1.isSimple());
- assertPathEquals(
- [
- 'M', 0, 0, 'L', 0, 10, 10, 10, 10, 0, 'X',
- 'M', 58.66, 70, 'A', 10, 20, 30, 30, 55, 77.32
- ],
- path1);
- }
- function testIsEmpty() {
- var path = new goog.math.Path();
- assertTrue('Initially path is empty', path.isEmpty());
- path.moveTo(0, 0);
- assertFalse('After command addition, path is not empty', path.isEmpty());
- path.clear();
- assertTrue('After clear, path is empty again', path.isEmpty());
- }
- function testGetSegmentTypes() {
- var path = new goog.math.Path();
- path.moveTo(0, 0);
- path.lineTo(10, 20, 30, 40);
- path.close();
- var Segment = goog.math.Path.Segment;
- var segmentTypes = path.getSegmentTypes();
- assertArrayEquals(
- 'The returned segment types do not match the expected values',
- [Segment.MOVETO, Segment.LINETO, Segment.CLOSE], segmentTypes);
- segmentTypes[2] = Segment.LINETO;
- assertArrayEquals(
- 'Modifying the returned segment types changed the path',
- [Segment.MOVETO, Segment.LINETO, Segment.CLOSE], path.getSegmentTypes());
- }
- function testGetSegmentCounts() {
- var path = new goog.math.Path();
- path.moveTo(0, 0);
- path.lineTo(10, 20, 30, 40);
- path.close();
- var segmentTypes = path.getSegmentCounts();
- assertArrayEquals(
- 'The returned segment counts do not match the expected values', [1, 2, 1],
- segmentTypes);
- segmentTypes[1] = 3;
- assertArrayEquals(
- 'Modifying the returned segment counts changed the path', [1, 2, 1],
- path.getSegmentCounts());
- }
- function testGetSegmentArgs() {
- var path = new goog.math.Path();
- path.moveTo(0, 0);
- path.lineTo(10, 20, 30, 40);
- path.close();
- var segmentTypes = path.getSegmentArgs();
- assertArrayEquals(
- 'The returned segment args do not match the expected values',
- [0, 0, 10, 20, 30, 40], segmentTypes);
- segmentTypes[1] = -10;
- assertArrayEquals(
- 'Modifying the returned segment args changed the path',
- [0, 0, 10, 20, 30, 40], path.getSegmentArgs());
- }
|