e71e9ef311
This should make the logs in the bots more actionable by showing the error and trace. This also fixes the API change causing mysterious red. Bug: skia: Change-Id: I38df2bb4557041f8bdfefcae5c8d95b58e770033 Reviewed-on: https://skia-review.googlesource.com/c/168180 Reviewed-by: Kevin Lubick <kjlubick@google.com>
186 lines
6.7 KiB
JavaScript
186 lines
6.7 KiB
JavaScript
|
|
describe('PathKit\'s Path Behavior', function() {
|
|
// Note, don't try to print the PathKit object - it can cause Karma/Jasmine to lock up.
|
|
var PathKit = null;
|
|
const LoadPathKit = new Promise(function(resolve, reject) {
|
|
if (PathKit) {
|
|
resolve();
|
|
} else {
|
|
PathKitInit({
|
|
locateFile: (file) => '/pathkit/'+file,
|
|
}).then((_PathKit) => {
|
|
PathKit = _PathKit;
|
|
resolve();
|
|
});
|
|
}
|
|
});
|
|
|
|
describe('Basic Path Features', function() {
|
|
function drawSimplePath() {
|
|
let path = PathKit.NewPath();
|
|
path.moveTo(0, 0);
|
|
path.lineTo(10, 0);
|
|
path.lineTo(10, 10);
|
|
path.close();
|
|
return path;
|
|
}
|
|
|
|
it('supports.equals()', function(done) {
|
|
LoadPathKit.then(catchException(done, () => {
|
|
let path = drawSimplePath();
|
|
let otherPath = drawSimplePath();
|
|
let blank = PathKit.NewPath();
|
|
|
|
expect(path.equals(path)).toBe(true);
|
|
expect(otherPath.equals(path)).toBe(true);
|
|
expect(path.equals(otherPath)).toBe(true);
|
|
|
|
expect(path.equals(blank)).toBe(false);
|
|
expect(otherPath.equals(blank)).toBe(false);
|
|
expect(blank.equals(path)).toBe(false);
|
|
expect(blank.equals(otherPath)).toBe(false);
|
|
|
|
path.delete();
|
|
otherPath.delete();
|
|
blank.delete();
|
|
done();
|
|
}));
|
|
});
|
|
|
|
it('has a copy constructor', function(done) {
|
|
LoadPathKit.then(catchException(done, () => {
|
|
let orig = drawSimplePath();
|
|
let copy = new PathKit.SkPath(orig);
|
|
|
|
expect(orig.toSVGString()).toEqual(copy.toSVGString());
|
|
expect(orig.equals(copy)).toBe(true);
|
|
|
|
orig.delete();
|
|
copy.delete();
|
|
done();
|
|
}));
|
|
});
|
|
|
|
it('has a copy method', function(done) {
|
|
LoadPathKit.then(catchException(done, () => {
|
|
let orig = drawSimplePath();
|
|
let copy = orig.copy();
|
|
|
|
expect(orig.toSVGString()).toEqual(copy.toSVGString());
|
|
expect(orig.equals(copy)).toBe(true);
|
|
|
|
orig.delete();
|
|
copy.delete();
|
|
done();
|
|
}));
|
|
});
|
|
|
|
it('can create a copy with MakePath', function(done) {
|
|
LoadPathKit.then(catchException(done, () => {
|
|
let orig = drawSimplePath();
|
|
let copy = PathKit.NewPath(orig);
|
|
|
|
expect(orig.toSVGString()).toEqual(copy.toSVGString());
|
|
expect(orig.equals(copy)).toBe(true);
|
|
|
|
orig.delete();
|
|
copy.delete();
|
|
done();
|
|
}));
|
|
});
|
|
});
|
|
|
|
function ExpectRectsToBeEqual(actual, expected) {
|
|
if (PathKit.usingWasm) {
|
|
// exact match
|
|
expect(actual).toEqual(expected);
|
|
} else {
|
|
// floats get rounded a little bit
|
|
expect(actual.fLeft).toBeCloseTo(expected.fLeft, 4);
|
|
expect(actual.fTop).toBeCloseTo(expected.fTop, 4);
|
|
expect(actual.fRight).toBeCloseTo(expected.fRight, 4);
|
|
expect(actual.fBottom).toBeCloseTo(expected.fBottom, 4);
|
|
}
|
|
}
|
|
|
|
function bits2float(str) {
|
|
return PathKit.SkBits2FloatUnsigned(parseInt(str))
|
|
}
|
|
|
|
describe('bounds and rect', function(){
|
|
it('dynamically updates getBounds()', function(done){
|
|
LoadPathKit.then(catchException(done, () => {
|
|
// Based on test_bounds_crbug_513799
|
|
let path = PathKit.NewPath();
|
|
expect(path.getBounds()).toEqual(PathKit.LTRBRect(0, 0, 0, 0));
|
|
path.moveTo(-5, -8);
|
|
expect(path.getBounds()).toEqual(PathKit.LTRBRect(-5, -8, -5, -8));
|
|
path.rect(1, 2, 2, 2);
|
|
expect(path.getBounds()).toEqual(PathKit.LTRBRect(-5, -8, 3, 4));
|
|
path.moveTo(1, 2);
|
|
expect(path.getBounds()).toEqual(PathKit.LTRBRect(-5, -8, 3, 4));
|
|
path.delete();
|
|
done();
|
|
}));
|
|
});
|
|
|
|
it('has getBounds() and computeTightBounds()', function(done){
|
|
LoadPathKit.then(catchException(done, () => {
|
|
// Based on PathOpsTightBoundsIllBehaved
|
|
let path = PathKit.NewPath();
|
|
path.moveTo(1, 1);
|
|
path.quadraticCurveTo(4, 3, 2, 2);
|
|
expect(path.getBounds()).toEqual(PathKit.LTRBRect(1, 1, 4, 3));
|
|
ExpectRectsToBeEqual(path.computeTightBounds(),
|
|
PathKit.LTRBRect(1, 1,
|
|
bits2float("0x40333334"), // 2.8
|
|
bits2float("0x40155556"))); // 2.3333333
|
|
path.delete();
|
|
|
|
done();
|
|
}));
|
|
});
|
|
});
|
|
|
|
function ExpectCmdsToBeEqual(actual, expected) {
|
|
if (PathKit.usingWasm) {
|
|
// exact match
|
|
expect(actual).toEqual(expected);
|
|
} else {
|
|
// lossy match
|
|
actual.every((cmd, cmdIdx) => {
|
|
cmd.every((arg, argIdx) => {
|
|
// The asm.js code is close to the wasm/c++ output, but not quite.
|
|
expect(arg).toBeCloseTo(expected[cmdIdx][argIdx], 4)
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
describe('Command arrays', function(){
|
|
it('does NOT approximates conics when dumping as toCmds', function(done){
|
|
LoadPathKit.then(catchException(done, () => {
|
|
let path = PathKit.NewPath();
|
|
path.moveTo(20, 120);
|
|
path.arc(20, 120, 18, 0, 1.75 * Math.PI);
|
|
path.lineTo(20, 120);
|
|
|
|
let expectedCmds = [
|
|
[PathKit.MOVE_VERB, 20, 120],
|
|
[PathKit.LINE_VERB, 38, 120],
|
|
[PathKit.CONIC_VERB, 38, 138, 20, 138, bits2float("0x3f3504f3)")], // 0.707107f
|
|
[PathKit.CONIC_VERB, 2, 138, 2, 120, bits2float("0x3f3504f3)")], // 0.707107f
|
|
[PathKit.CONIC_VERB, 2, 102, 20, 102, bits2float("0x3f3504f3)")], // 0.707107f
|
|
[PathKit.CONIC_VERB, bits2float("0x41dba58e"), 102, bits2float("0x4202e962"), bits2float("0x42d68b4d"), bits2float("0x3f6c8361")], // 27.4558, 102, 32.7279, 107.272, 0.92388
|
|
[PathKit.LINE_VERB, 20, 120],
|
|
];
|
|
ExpectCmdsToBeEqual(path.toCmds(), expectedCmds);
|
|
|
|
path.delete();
|
|
done();
|
|
}));
|
|
});
|
|
});
|
|
|
|
});
|