jointjs
Version:
JavaScript diagramming library
892 lines (669 loc) • 41.4 kB
JavaScript
'use strict';
QUnit.module('line', function() {
QUnit.module('constructor', function() {
QUnit.test('creates a new Line object', function(assert) {
var line = new g.Line();
assert.ok(line instanceof g.Line, 'no arguments provided');
var line1 = new g.Line(new g.Point(), new g.Point(3, 8));
assert.ok(line1 instanceof g.Line, 'returns instance of g.Line');
assert.ok(typeof line1.start !== 'undefined', 'has "start" property');
assert.ok(typeof line1.end !== 'undefined', 'has "end" property');
assert.equal(line1.start.x, 0, 'start.x is correct');
assert.equal(line1.start.y, 0, 'start.y is correct');
assert.equal(line1.end.x, 3, 'end.x is correct');
assert.equal(line1.end.y, 8, 'end.y is correct');
var line2 = new g.Line(line1);
assert.ok(line2 instanceof g.Line, 'returns instance of g.Line');
assert.ok(typeof line2.start !== 'undefined', 'has "start" property');
assert.ok(typeof line2.end !== 'undefined', 'has "end" property');
assert.notOk(line1 === line2);
assert.equal(line1.toString(), line2.toString());
assert.ok(line1.equals(line2));
});
});
QUnit.module('prototype', function() {
QUnit.module('bbox()', function() {
QUnit.test('sanity', function(assert) {
assert.ok((new g.Line('0 0', '0 0')).bbox() instanceof g.Rect);
assert.ok((new g.Line('0 0', '10 0')).bbox() instanceof g.Rect);
assert.ok((new g.Line('0 0', '0 10')).bbox() instanceof g.Rect);
assert.ok((new g.Line('0 0', '10 10')).bbox() instanceof g.Rect);
assert.ok((new g.Line('0 0', '-10 0')).bbox() instanceof g.Rect);
assert.ok((new g.Line('0 0', '0 -10')).bbox() instanceof g.Rect);
assert.ok((new g.Line('0 0', '-10 -10')).bbox() instanceof g.Rect);
});
QUnit.test('should return the line\'s bounding box', function(assert) {
assert.equal((new g.Line('0 0', '0 0')).bbox().toString(), (new g.Rect(0, 0, 0, 0)).toString());
assert.equal((new g.Line('0 0', '10 0')).bbox().toString(), (new g.Rect(0, 0, 10, 0)).toString());
assert.equal((new g.Line('0 0', '0 10')).bbox().toString(), (new g.Rect(0, 0, 0, 10)).toString());
assert.equal((new g.Line('0 0', '10 10')).bbox().toString(), (new g.Rect(0, 0, 10, 10)).toString());
assert.equal((new g.Line('0 0', '-10 0')).bbox().toString(), (new g.Rect(-10, 0, 10, 0)).toString());
assert.equal((new g.Line('0 0', '0 -10')).bbox().toString(), (new g.Rect(0, -10, 0, 10)).toString());
assert.equal((new g.Line('0 0', '-10 -10')).bbox().toString(), (new g.Rect(-10, -10, 10, 10)).toString());
});
});
QUnit.module('bearing()', function() {
QUnit.test('should return the line\'s bearing', function(assert) {
assert.equal((new g.Line('0 0', '0 -10')).bearing(), 'S', 'south bearing');
assert.equal((new g.Line('0 0', '0 10')).bearing(), 'N', 'north bearing');
assert.equal((new g.Line('0 0', '10 10')).bearing(), 'NE', 'north east bearing');
assert.equal((new g.Line('0 0', '-10 10')).bearing(), 'NW', 'north west bearing');
assert.equal((new g.Line('0 0', '10 0')).bearing(), 'E', 'east bearing');
assert.equal((new g.Line('0 0', '-10 0')).bearing(), 'W', 'west bearing');
assert.equal((new g.Line('0 0', '-10 -10')).bearing(), 'SW', 'south west bearing');
assert.equal((new g.Line('0 0', '10 -10')).bearing(), 'SE', 'south east bearing');
});
});
QUnit.module('clone()', function() {
QUnit.test('sanity', function(assert) {
assert.ok((new g.Line('1 2', '3 4')).clone() instanceof g.Line);
});
QUnit.test('returns a clone', function(assert) {
var l1 = new g.Line('1 2', '3 4');
var l2 = l1.clone();
assert.notOk(l1 === l2);
assert.equal(l1.toString(), l2.toString());
assert.ok(l1.equals(l2));
});
});
QUnit.module('closestPoint(p)', function() {
QUnit.test('returns the closest point', function(assert) {
var line = new g.Line('10 0', '20 0');
assert.equal(line.closestPoint(new g.Point(15,0)).toString(), '15@0');
assert.equal(line.closestPoint(new g.Point(15,20)).toString(), '15@0');
assert.equal(line.closestPoint(new g.Point(15,-20)).toString(), '15@0');
assert.equal(line.closestPoint(new g.Point(20,10)).toString(), '20@0');
assert.equal(line.closestPoint(new g.Point(0,10)).toString(), '10@0');
assert.equal(line.closestPoint(new g.Point(30,10)).toString(), '20@0');
assert.equal(line.closestPoint(new g.Point(-10,10)).toString(), '10@0');
});
});
QUnit.module('closestPointLength(p)', function() {
QUnit.test('returns the length of the closest point', function(assert) {
var line = new g.Line('10 0', '20 0');
assert.equal(line.closestPointLength(new g.Point(15,0)), 5);
assert.equal(line.closestPointLength(new g.Point(15,20)), 5);
assert.equal(line.closestPointLength(new g.Point(15,-20)), 5);
assert.equal(line.closestPointLength(new g.Point(20,10)), 10);
assert.equal(line.closestPointLength(new g.Point(0,10)), 0);
assert.equal(line.closestPointLength(new g.Point(30,10)), 10);
assert.equal(line.closestPointLength(new g.Point(-10,10)), 0);
});
});
QUnit.module('closestPointNormalizedLength(p)', function() {
QUnit.test('returns the normalized length of the closest point', function(assert) {
var line = new g.Line('10 0', '20 0');
assert.equal(line.closestPointNormalizedLength(new g.Point(15,0)), 0.5);
assert.equal(line.closestPointNormalizedLength(new g.Point(15,20)), 0.5);
assert.equal(line.closestPointNormalizedLength(new g.Point(15,-20)), 0.5);
assert.equal(line.closestPointNormalizedLength(new g.Point(20,10)), 1);
assert.equal(line.closestPointNormalizedLength(new g.Point(0,10)), 0);
assert.equal(line.closestPointNormalizedLength(new g.Point(30,10)), 1);
assert.equal(line.closestPointNormalizedLength(new g.Point(-10,10)), 0);
});
});
QUnit.module('closestPointTangent(p)', function() {
QUnit.test('returns the tangent to line at the closest point', function(assert) {
var line = new g.Line('10 0', '20 0');
assert.equal(line.closestPointTangent(new g.Point(15,0)).toString(), '15@0 25@0');
assert.equal(line.closestPointTangent(new g.Point(15,20)).toString(), '15@0 25@0');
assert.equal(line.closestPointTangent(new g.Point(15,-20)).toString(), '15@0 25@0');
assert.equal(line.closestPointTangent(new g.Point(20,10)).toString(), '20@0 30@0');
assert.equal(line.closestPointTangent(new g.Point(0,10)).toString(), '10@0 20@0');
assert.equal(line.closestPointTangent(new g.Point(30,10)).toString(), '20@0 30@0');
assert.equal(line.closestPointTangent(new g.Point(-10,10)).toString(), '10@0 20@0');
});
});
QUnit.module('containsPoint()', function() {
QUnit.test('returns true if point lies on the line', function(assert) {
var line = new g.Line('10 0', '20 0');
var point;
point = new g.Point(10, 0);
assert.equal(line.containsPoint(point), true);
point = new g.Point(15, 0);
assert.equal(line.containsPoint(point), true);
point = new g.Point(20, 0);
assert.equal(line.containsPoint(point), true);
point = new g.Point(5, 0);
assert.equal(line.containsPoint(point), false);
point = new g.Point(15, 10);
assert.equal(line.containsPoint(point), false);
point = new g.Point(25, 0);
assert.equal(line.containsPoint(point), false);
});
});
QUnit.module('divideAt()', function() {
QUnit.test('sanity', function(assert) {
var line = new g.Line('10 0', '20 0');
var lineDivide;
lineDivide = line.divideAt(0.5); // normal
assert.ok(Array.isArray(lineDivide));
assert.equal(lineDivide.length, 2);
assert.ok(lineDivide[0] instanceof g.Line);
assert.ok(lineDivide[1] instanceof g.Line);
lineDivide = line.divideAt(0); // minimum
assert.ok(Array.isArray(lineDivide));
assert.equal(lineDivide.length, 2);
assert.ok(lineDivide[0] instanceof g.Line);
assert.ok(lineDivide[1] instanceof g.Line);
lineDivide = line.divideAt(-1); // too little
assert.ok(Array.isArray(lineDivide));
assert.equal(lineDivide.length, 2);
assert.ok(lineDivide[0] instanceof g.Line);
assert.ok(lineDivide[1] instanceof g.Line);
lineDivide = line.divideAt(1); // maximum
assert.ok(Array.isArray(lineDivide));
assert.equal(lineDivide.length, 2);
assert.ok(lineDivide[0] instanceof g.Line);
assert.ok(lineDivide[1] instanceof g.Line);
lineDivide = line.divideAt(10); // too much
assert.ok(Array.isArray(lineDivide));
assert.equal(lineDivide.length, 2);
assert.ok(lineDivide[0] instanceof g.Line);
assert.ok(lineDivide[1] instanceof g.Line);
});
QUnit.test('returns an array with two curves, divided at provided `ratio`', function(assert) {
var line = new g.Line('10 0', '20 0');
var lineDivide;
lineDivide = line.divideAt(0.5);
assert.equal(lineDivide[0].toString(), '10@0 15@0');
assert.equal(lineDivide[1].toString(), '15@0 20@0');
lineDivide = line.divideAt(0);
assert.equal(lineDivide[0].toString(), '10@0 10@0');
assert.equal(lineDivide[1].toString(), '10@0 20@0');
lineDivide = line.divideAt(-1);
assert.equal(lineDivide[0].toString(), '10@0 10@0');
assert.equal(lineDivide[1].toString(), '10@0 20@0');
lineDivide = line.divideAt(1);
assert.equal(lineDivide[0].toString(), '10@0 20@0');
assert.equal(lineDivide[1].toString(), '20@0 20@0');
lineDivide = line.divideAt(10);
assert.equal(lineDivide[0].toString(), '10@0 20@0');
assert.equal(lineDivide[1].toString(), '20@0 20@0');
});
});
QUnit.module('divideAtLength()', function() {
QUnit.test('sanity', function(assert) {
var line = new g.Line('10 0', '20 0');
var lineDivide;
lineDivide = line.divideAtLength(5); // normal
assert.ok(Array.isArray(lineDivide));
assert.equal(lineDivide.length, 2);
assert.ok(lineDivide[0] instanceof g.Line);
assert.ok(lineDivide[1] instanceof g.Line);
lineDivide = line.divideAtLength(-5); // normal negative
assert.ok(Array.isArray(lineDivide));
assert.equal(lineDivide.length, 2);
assert.ok(lineDivide[0] instanceof g.Line);
assert.ok(lineDivide[1] instanceof g.Line);
lineDivide = line.divideAtLength(0); // minimum
assert.ok(Array.isArray(lineDivide));
assert.equal(lineDivide.length, 2);
assert.ok(lineDivide[0] instanceof g.Line);
assert.ok(lineDivide[1] instanceof g.Line);
lineDivide = line.divideAtLength(100); // too much
assert.ok(Array.isArray(lineDivide));
assert.equal(lineDivide.length, 2);
assert.ok(lineDivide[0] instanceof g.Line);
assert.ok(lineDivide[1] instanceof g.Line);
lineDivide = line.divideAtLength(-100); // too much negative
assert.ok(Array.isArray(lineDivide));
assert.equal(lineDivide.length, 2);
assert.ok(lineDivide[0] instanceof g.Line);
assert.ok(lineDivide[1] instanceof g.Line);
});
QUnit.test('returns an array with two curves, divided at provided `length`', function(assert) {
var line = new g.Line('10 0', '20 0');
var lineDivide;
lineDivide = line.divideAtLength(5);
assert.equal(lineDivide[0].toString(), '10@0 15@0');
assert.equal(lineDivide[1].toString(), '15@0 20@0');
lineDivide = line.divideAtLength(-5);
assert.equal(lineDivide[0].toString(), '10@0 15@0');
assert.equal(lineDivide[1].toString(), '15@0 20@0');
lineDivide = line.divideAtLength(0);
assert.equal(lineDivide[0].toString(), '10@0 10@0');
assert.equal(lineDivide[1].toString(), '10@0 20@0');
lineDivide = line.divideAtLength(100);
assert.equal(lineDivide[0].toString(), '10@0 20@0');
assert.equal(lineDivide[1].toString(), '20@0 20@0');
lineDivide = line.divideAtLength(-100);
assert.equal(lineDivide[0].toString(), '10@0 10@0');
assert.equal(lineDivide[1].toString(), '10@0 20@0');
});
});
QUnit.module('equals()', function() {
QUnit.test('checks whether two lines are exactly the same', function(assert) {
var l1;
var l2;
l1 = new g.Line('100@100', '200@200');
l2 = new g.Line('100@100', '200@200');
assert.equal(l1.equals(l2), true);
l1 = new g.Line('100@100', '200@200');
l2 = new g.Line('100@100', '100@200');
assert.equal(l1.equals(l2), false);
l1 = new g.Line('100@100', '200@200');
l2 = new g.Line('200@200', '100@100');
assert.equal(l1.equals(l2), false);
});
});
// Kept for backwards compatibility
QUnit.module('intersection(line)', function() {
QUnit.test('returns an intersection point for the line', function(assert) {
var line1 = new g.Line('0 0', '8 0');
var line2 = new g.Line('4 4', '4 -4');
assert.equal(line1.intersection(line2).toString(), '4@0');
var line3 = new g.Line('0 2', '2 8');
assert.equal(line1.intersection(line3), null);
});
});
QUnit.module('intersect(line)', function() {
QUnit.test('returns an intersection point for the line', function(assert) {
var line1 = new g.Line('2 4', '5 1');
var line2 = new g.Line('2 1', '5 4');
assert.equal(line1.intersection(line2).toString(), '3.5@2.5');
var line3 = new g.Line('0 2', '2 8');
assert.equal(line1.intersection(line3), null);
});
QUnit.test('returns the correct intersection points for lines in different directions', function(assert) {
// The following test uses/assumes the lines of a rectangle and its diagonal for easy understanding.
// diagonal in both directions
var line1a = new g.Line('0 0', '10 10');
var line1b = new g.Line('10 10', '0 0');
// left line
var line2a = new g.Line('0 0', '0 10');
var line2b = new g.Line('0 10', '0 0');
// top line
var line3a = new g.Line('0 0', '10 0');
var line3b = new g.Line('10 0', '0 0');
// right line
var line4a = new g.Line('10 0', '10 10');
var line4b = new g.Line('10 10', '10 0');
// bottom line
var line5a = new g.Line('0 10', '10 10');
var line5b = new g.Line('10 10', '0 10');
// Test diagonal intersection in '->' direction with all the other lines ('->' direction)
assert.equal(line1a.intersection(line2a).toString(), '0@0');
assert.equal(line1a.intersection(line3a).toString(), '0@0');
assert.equal(line1a.intersection(line4a).toString(), '10@10');
assert.equal(line1a.intersection(line5a).toString(), '10@10');
// Test diagonal intersection in '->' direction with all the other lines ('<-' direction)
assert.equal(line1a.intersection(line2b).toString(), '0@0');
assert.equal(line1a.intersection(line3b).toString(), '0@0');
assert.equal(line1a.intersection(line4b).toString(), '10@10');
assert.equal(line1a.intersection(line5b).toString(), '10@10');
// Test diagonal intersection in '<-' direction with all the other lines ('->' direction)
assert.equal(line1b.intersection(line2a).toString(), '0@0');
assert.equal(line1b.intersection(line3a).toString(), '0@0');
assert.equal(line1b.intersection(line4a).toString(), '10@10');
assert.equal(line1b.intersection(line5a).toString(), '10@10');
// Test diagonal intersection in '<-' direction with all the other lines ('<-' direction)
assert.equal(line1b.intersection(line2b).toString(), '0@0');
assert.equal(line1b.intersection(line3b).toString(), '0@0');
assert.equal(line1b.intersection(line4b).toString(), '10@10');
assert.equal(line1b.intersection(line5b).toString(), '10@10');
// Test left line intersection in '->' direction with top line (both directions)
assert.equal(line2a.intersection(line3a).toString(), '0@0');
assert.equal(line2a.intersection(line3b).toString(), '0@0');
// Test left line intersection in '<-' direction with top line (both directions)
assert.equal(line2b.intersection(line3a).toString(), '0@0');
assert.equal(line2b.intersection(line3b).toString(), '0@0');
});
});
QUnit.module('intersect(rectangle)', function() {
QUnit.test('returns null for a rectangle that does not intersect the line', function(assert) {
assert.equal(new g.Line('0 0', '0 -10').intersect(new g.Rect(10, 20, 30, 40)), null, 'no intersection point');
});
QUnit.test('returns an array of intersecting points with the rectangle', function(assert) {
var rect = new g.Rect(-10, -20, 30, 40);
var line1 = new g.Line('0 0', '20 0');
assert.equal(line1.intersect(rect).length, 1, 'one intersection point');
assert.equal(line1.intersect(rect)[0].toString(), '20@0');
var line2 = new g.Line('-20 0', '20 0');
assert.equal(line2.intersect(rect).length, 2, 'two intersection points');
assert.equal(line2.intersect(rect)[0].toString(), '20@0');
assert.equal(line2.intersect(rect)[1].toString(), '-10@0');
var line3 = new g.Line('0 0', '5 5');
rect = new g.Rect(0, 0, 5, 5);
assert.equal(line3.intersect(rect).length, 2, 'two intersection points');
assert.equal(line3.intersect(rect)[0].toString(), '0@0');
assert.equal(line3.intersect(rect)[1].toString(), '5@5');
});
});
QUnit.module('isDifferentiable()', function() {
QUnit.test('sanity', function(assert) {
var line;
line = new g.Line('0 0', '0 200');
assert.equal(typeof line.isDifferentiable(), 'boolean');
line = new g.Line('100 100', '100 100');
assert.equal(typeof line.isDifferentiable(), 'boolean');
});
QUnit.test('checks whether the line is differentiable (can have tangents)', function(assert) {
var line;
line = new g.Line('0 0', '0 200');
assert.equal(line.isDifferentiable(), true);
line = new g.Line('100 100', '100 100');
assert.equal(line.isDifferentiable(), false);
});
});
QUnit.module('length()', function() {
});
QUnit.module('midpoint()', function() {
});
QUnit.module('pointAt()', function() {
QUnit.test('sanity', function(assert) {
var line = new g.Line('0 0', '100 0');
assert.ok(line.pointAt(0.4) instanceof g.Point);
assert.ok(line.pointAt(0.4, { precision: 0 }) instanceof g.Point);
assert.ok(line.pointAt(-1) instanceof g.Point);
assert.ok(line.pointAt(10) instanceof g.Point);
});
QUnit.test('returns a point at given length ratio', function(assert) {
var line = new g.Line('0 0', '100 0');
assert.equal(line.pointAt(0.4).toString(), '40@0');
assert.equal(line.pointAt(0.4, { precision: 0 }).toString(), '40@0');
assert.equal(line.pointAt(-1).toString(), '0@0');
assert.equal(line.pointAt(10).toString(), '100@0');
});
});
QUnit.module('pointAtLength()', function() {
QUnit.test('sanity', function(assert) {
var line = new g.Line('0 0', '100 0');
assert.ok(line.pointAtLength(40) instanceof g.Point);
assert.ok(line.pointAtLength(40, { precision: 0 }) instanceof g.Point);
assert.ok(line.pointAtLength(10000) instanceof g.Point);
assert.ok(line.pointAtLength(-40) instanceof g.Point);
assert.ok(line.pointAtLength(-40, { precision: 0 }) instanceof g.Point);
assert.ok(line.pointAtLength(-10000) instanceof g.Point);
});
QUnit.test('returns a point at given length', function(assert) {
var line = new g.Line('0 0', '100 0');
assert.equal(line.pointAtLength(40).toString(), '40@0');
assert.equal(line.pointAtLength(40, { precision: 0 }).toString(), '40@0');
assert.equal(line.pointAtLength(10000).toString(), '100@0');
assert.equal(line.pointAtLength(-40).toString(), '60@0');
assert.equal(line.pointAtLength(-40, { precision: 0 }).toString(), '60@0');
assert.equal(line.pointAtLength(-10000).toString(), '0@0');
});
});
QUnit.module('pointOffset(point)', function() {
QUnit.test('is perpendicular distance', function(assert) {
[
new g.Line('0 0', '1 0'),
new g.Line('0 0', '10 0'),
new g.Line('0 0', '100 0')
].forEach(function(line) {
assert.equal(line.pointOffset('50@0'), 0);
assert.equal(line.pointOffset('50@10'), 10);
assert.equal(line.pointOffset('50@-10'), -10);
});
});
});
QUnit.module('parallel()', function() {
QUnit.test('sanity', function(assert) {
var line;
line = new g.Line('5 5', '20 20');
assert.notEqual(line, line.parallel(0));
assert.equal(line.toString(), line.parallel(0).toString());
assert.ok(line.parallel(0) instanceof g.Line);
assert.ok(line.parallel(20) instanceof g.Line);
line = new g.Line('5 5', '5 5');
assert.ok(line.clone().parallel(20) instanceof g.Line);
});
QUnit.test('should return a parallel version of self', function(assert) {
var line, p1, p2;
line = new g.Line('5 5', '20 5');
p1 = line.parallel(5);
p1.start.round();
p1.end.round();
assert.equal(p1.toString(), '5@10 20@10');
p2 = line.parallel(-5);
p2.start.round();
p2.end.round();
assert.equal(p2.toString(), '5@0 20@0');
line = new g.Line('5 5', '5 20');
p1 = line.parallel(5);
p1.start.round();
p1.end.round();
assert.equal(p1.toString(), '0@5 0@20');
p2 = line.parallel(-5);
p2.start.round();
p2.end.round();
assert.equal(p2.toString(), '10@5 10@20');
});
});
QUnit.module('rotate()', function() {
QUnit.test('sanity', function(assert) {
var line = new g.Line('5 5', '20 20');
var angle;
var nullPoint = null;
var zeroPoint = new g.Point('0 0');
var startPoint = line.start;
var arbitraryPoint = new g.Point('14 6');
angle = 0;
assert.ok(line.clone().rotate(nullPoint, angle) instanceof g.Line);
assert.ok(line.clone().rotate(zeroPoint, angle) instanceof g.Line);
assert.ok(line.clone().rotate(startPoint, angle) instanceof g.Line);
assert.ok(line.clone().rotate(arbitraryPoint, angle) instanceof g.Line);
angle = 154;
assert.ok(line.clone().rotate(nullPoint, angle) instanceof g.Line);
assert.ok(line.clone().rotate(zeroPoint, angle) instanceof g.Line);
assert.ok(line.clone().rotate(startPoint, angle) instanceof g.Line);
assert.ok(line.clone().rotate(arbitraryPoint, angle) instanceof g.Line);
angle = 360;
assert.ok(line.clone().rotate(nullPoint, angle) instanceof g.Line);
assert.ok(line.clone().rotate(zeroPoint, angle) instanceof g.Line);
assert.ok(line.clone().rotate(startPoint, angle) instanceof g.Line);
assert.ok(line.clone().rotate(arbitraryPoint, angle) instanceof g.Line);
angle = 1080;
assert.ok(line.clone().rotate(nullPoint, angle) instanceof g.Line);
assert.ok(line.clone().rotate(zeroPoint, angle) instanceof g.Line);
assert.ok(line.clone().rotate(startPoint, angle) instanceof g.Line);
assert.ok(line.clone().rotate(arbitraryPoint, angle) instanceof g.Line);
});
QUnit.test('should return a rotated version of self', function(assert) {
var line = new g.Line('5 5', '20 20');
var angle;
var nullPoint = null;
var zeroPoint = new g.Point('0 0');
var startPoint = line.start;
var arbitraryPoint = new g.Point('14 6');
angle = 0;
assert.equal(line.clone().rotate(nullPoint, angle).round(3).toString(), '5@5 20@20');
assert.equal(line.clone().rotate(zeroPoint, angle).round(3).toString(), '5@5 20@20');
assert.equal(line.clone().rotate(startPoint, angle).round(3).toString(), '5@5 20@20');
assert.equal(line.clone().rotate(arbitraryPoint, angle).round(3).toString(), '5@5 20@20');
angle = 154;
assert.equal(line.clone().rotate(nullPoint, angle).round(3).toString(), '-2.302@-6.686 -9.208@-26.743');
assert.equal(line.clone().rotate(zeroPoint, angle).round(3).toString(), '-2.302@-6.686 -9.208@-26.743');
assert.equal(line.clone().rotate(startPoint, angle).round(3).toString(), '5@5 -1.906@-15.057');
assert.equal(line.clone().rotate(arbitraryPoint, angle).round(3).toString(), '21.651@10.844 14.744@-9.213');
});
QUnit.test('assert rotation 0 = 360 = 1080', function(assert) {
var line = new g.Line('5 5', '20 20');
var angle1;
var angle2;
var nullPoint = null;
var zeroPoint = new g.Point('0 0');
var startPoint = line.start;
var arbitraryPoint = new g.Point('14 6');
angle1 = 0;
angle2 = 360;
assert.equal(line.clone().rotate(nullPoint, angle1).toString(), line.clone().rotate(nullPoint, angle2).toString());
assert.equal(line.clone().rotate(zeroPoint, angle1).toString(), line.clone().rotate(zeroPoint, angle2).toString());
assert.equal(line.clone().rotate(startPoint, angle1).toString(), line.clone().rotate(startPoint, angle2).toString());
assert.equal(line.clone().rotate(arbitraryPoint, angle1).toString(), line.clone().rotate(arbitraryPoint, angle2).toString());
angle1 = 0;
angle2 = 1080;
assert.equal(line.clone().rotate(nullPoint, angle1).toString(), line.clone().rotate(nullPoint, angle2).toString());
assert.equal(line.clone().rotate(zeroPoint, angle1).toString(), line.clone().rotate(zeroPoint, angle2).toString());
assert.equal(line.clone().rotate(startPoint, angle1).toString(), line.clone().rotate(startPoint, angle2).toString());
assert.equal(line.clone().rotate(arbitraryPoint, angle1).toString(), line.clone().rotate(arbitraryPoint, angle2).toString());
});
});
QUnit.module('round()', function() {
QUnit.test('sanity', function(assert) {
var line = new g.Line('5 5', '20 20');
var angle = 154;
var point = new g.Point('14 6');
assert.ok(line.clone().rotate(point, angle).round() instanceof g.Line);
assert.ok(line.clone().rotate(point, angle).round(0) instanceof g.Line);
assert.ok(line.clone().rotate(point, angle).round(1) instanceof g.Line);
assert.ok(line.clone().rotate(point, angle).round(2) instanceof g.Line);
assert.ok(line.clone().rotate(point, angle).round(3) instanceof g.Line);
assert.ok(line.clone().rotate(point, angle).round(4) instanceof g.Line);
assert.ok(line.clone().rotate(point, angle).round(10) instanceof g.Line);
assert.ok(line.clone().rotate(point, angle).round(-1) instanceof g.Line);
assert.ok(line.clone().rotate(point, angle).round(-10) instanceof g.Line);
});
QUnit.test('should return a rounded version of self', function(assert) {
var line = new g.Line('5 5', '20 20');
var angle = 154;
var point = new g.Point('14 6');
assert.equal(line.clone().rotate(point, angle).round().toString(), '22@11 15@-9');
assert.equal(line.clone().rotate(point, angle).round(0).toString(), '22@11 15@-9');
assert.equal(line.clone().rotate(point, angle).round(1).toString(), '21.7@10.8 14.7@-9.2');
assert.equal(line.clone().rotate(point, angle).round(2).toString(), '21.65@10.84 14.74@-9.21');
assert.equal(line.clone().rotate(point, angle).round(3).toString(), '21.651@10.844 14.744@-9.213');
assert.equal(line.clone().rotate(point, angle).round(4).toString(), '21.6508@10.8441 14.7444@-9.2133');
assert.equal(line.clone().rotate(point, angle).round(10).toString(), '21.6507752699@10.8441343674 14.7444317773@-9.2133435289');
assert.equal(line.clone().rotate(point, angle).round(-1).toString(), '20@10 10@-10');
assert.equal(line.clone().rotate(point, angle).round(-10).toString(), '0@0 0@0');
});
});
QUnit.module('scale()', function() {
QUnit.test('sanity', function(assert) {
var line = new g.Line('5 5', '20 20');
assert.ok(line.clone().scale(0, 0) instanceof g.Line);
assert.ok(line.clone().scale(0, 0, new g.Point('0 0')) instanceof g.Line);
assert.ok(line.clone().scale(0, 0, new g.Point('10 10')) instanceof g.Line);
assert.ok(line.clone().scale(0, 1) instanceof g.Line);
assert.ok(line.clone().scale(0, 1, new g.Point('0 0')) instanceof g.Line);
assert.ok(line.clone().scale(0, 1, new g.Point('10 10')) instanceof g.Line);
assert.ok(line.clone().scale(1, 0) instanceof g.Line);
assert.ok(line.clone().scale(1, 0, new g.Point('0 0')) instanceof g.Line);
assert.ok(line.clone().scale(1, 0, new g.Point('10 10')) instanceof g.Line);
assert.ok(line.clone().scale(1, 1) instanceof g.Line);
assert.ok(line.clone().scale(1, 1, new g.Point('0 0')) instanceof g.Line);
assert.ok(line.clone().scale(1, 1, new g.Point('10 10')) instanceof g.Line);
assert.ok(line.clone().scale(10, 10) instanceof g.Line);
assert.ok(line.clone().scale(10, 10, new g.Point('0 0')) instanceof g.Line);
assert.ok(line.clone().scale(10, 10, new g.Point('10 10')) instanceof g.Line);
});
QUnit.test('should return a scaled version of self', function(assert) {
var line = new g.Line('5 5', '20 20');
assert.equal(line.clone().scale(0, 0).toString(), '0@0 0@0');
assert.equal(line.clone().scale(0, 0, new g.Point('0 0')).toString(), '0@0 0@0');
assert.equal(line.clone().scale(0, 0, new g.Point('10 10')).toString(), '10@10 10@10');
assert.equal(line.clone().scale(0, 1).toString(), '0@5 0@20');
assert.equal(line.clone().scale(0, 1, new g.Point('0 0')).toString(), '0@5 0@20');
assert.equal(line.clone().scale(0, 1, new g.Point('10 10')).toString(), '10@5 10@20');
assert.equal(line.clone().scale(1, 0).toString(), '5@0 20@0');
assert.equal(line.clone().scale(1, 0, new g.Point('0 0')).toString(), '5@0 20@0');
assert.equal(line.clone().scale(1, 0, new g.Point('10 10')).toString(), '5@10 20@10');
assert.equal(line.clone().scale(1, 1).toString(), '5@5 20@20');
assert.equal(line.clone().scale(1, 1, new g.Point('0 0')).toString(), '5@5 20@20');
assert.equal(line.clone().scale(1, 1, new g.Point('10 10')).toString(), '5@5 20@20');
assert.equal(line.clone().scale(10, 10).toString(), '50@50 200@200');
assert.equal(line.clone().scale(10, 10, new g.Point('0 0')).toString(), '50@50 200@200');
assert.equal(line.clone().scale(10, 10, new g.Point('10 10')).toString(), '-40@-40 110@110');
});
});
QUnit.module('setLength()', function() {
QUnit.test('sanity', function(assert) {
var line;
line = new g.Line('5 5', '5 5');
assert.ok(line.clone().setLength(0) instanceof g.Line);
assert.ok(line.clone().setLength(10) instanceof g.Line);
line = new g.Line('5 5', '5 20');
assert.ok(line.clone().setLength(0) instanceof g.Line);
assert.ok(line.clone().setLength(10) instanceof g.Line);
});
QUnit.test('should return a scaled version of self with requested length', function(assert) {
var line;
line = new g.Line('5 5', '5 5');
assert.ok(line.clone().setLength(0) instanceof g.Line);
assert.ok(line.clone().setLength(10) instanceof g.Line);
line = new g.Line('5 5', '5 20');
assert.equal(line.clone().setLength(0).toString(), '5@5 5@5');
assert.equal(line.clone().setLength(10).toString(), '5@5 5@15');
});
});
QUnit.module('squaredLength()', function() {
});
QUnit.module('tangentAt()', function() {
QUnit.test('sanity', function(assert) {
var line;
line = new g.Line('10 10', '20 20');
assert.ok(line.tangentAt(0.4) instanceof g.Line);
assert.ok(line.tangentAt(-1) instanceof g.Line);
assert.ok(line.tangentAt(10) instanceof g.Line);
line = new g.Line('10 10', '10 10');
assert.equal(line.tangentAt(0.4), null);
});
QUnit.test('should return a line tangent to line at given length ratio', function(assert) {
var line = new g.Line('10 10', '20 20');
assert.equal(line.tangentAt(0.4).toString(), '14@14 24@24');
assert.equal(line.tangentAt(-1).toString(), '10@10 20@20');
assert.equal(line.tangentAt(10).toString(), '20@20 30@30');
});
});
QUnit.module('tangentAtLength()', function() {
QUnit.test('sanity', function(assert) {
var line;
line = new g.Line('10 10', '20 20');
assert.ok(line.tangentAtLength(4) instanceof g.Line);
assert.ok(line.tangentAtLength(10000) instanceof g.Line);
assert.ok(line.tangentAtLength(-4) instanceof g.Line);
assert.ok(line.tangentAtLength(-10000) instanceof g.Line);
line = new g.Line('10 10', '10 10');
assert.equal(line.tangentAtLength(), null);
});
QUnit.test('should return a line tangent to line at given length', function(assert) {
var line = new g.Line('10 10', '20 20');
assert.equal(line.tangentAtLength(4).toString(), '12.82842712474619@12.82842712474619 22.82842712474619@22.82842712474619');
assert.equal(line.tangentAtLength(10000).toString(), '20@20 30@30');
assert.equal(line.tangentAtLength(-4).toString(), '17.17157287525381@17.17157287525381 27.17157287525381@27.17157287525381');
assert.equal(line.tangentAtLength(-10000).toString(), '10@10 20@20');
});
});
QUnit.module('translate()', function() {
QUnit.test('sanity', function(assert) {
var line = new g.Line('5 5', '20 20');
assert.ok(line.clone().translate(0, 0) instanceof g.Line);
assert.ok(line.clone().translate(0, 10) instanceof g.Line);
assert.ok(line.clone().translate(10, 0) instanceof g.Line);
assert.ok(line.clone().translate(10, 10) instanceof g.Line);
});
QUnit.test('should return a translated version of self', function(assert) {
var line = new g.Line('5 5', '20 20');
assert.equal(line.clone().translate(0, 0).toString(), '5@5 20@20');
assert.equal(line.clone().translate(0, 10).toString(), '5@15 20@30');
assert.equal(line.clone().translate(10, 0).toString(), '15@5 30@20');
assert.equal(line.clone().translate(10, 10).toString(), '15@15 30@30');
});
});
QUnit.module('vector()', function() {
QUnit.test('sanity', function(assert) {
var line = new g.Line();
assert.ok(line.vector() instanceof g.Point);
});
QUnit.test('returns the vector of the line', function(assert) {
var line;
line = new g.Line('10 10', '20 30');
assert.equal(line.vector().toString(), '10@20');
line = new g.Line('20 30', '10 10');
assert.equal(line.vector().toString(), '-10@-20');
});
});
QUnit.module('toString()', function() {
});
QUnit.module('serialize()', function() {
QUnit.test('returns string with values of start and end points', function(assert) {
var value = (new g.Line('11 12', '13 14')).serialize();
assert.equal(typeof value, 'string');
assert.equal(value, '11,12 13,14');
});
});
});
});