Skip to content

Commit

Permalink
add tests for polygon data coming through callbacks
Browse files Browse the repository at this point in the history
  • Loading branch information
brendankenny committed Oct 21, 2015
1 parent 96756bd commit 16bd2cf
Show file tree
Hide file tree
Showing 5 changed files with 344 additions and 9 deletions.
7 changes: 4 additions & 3 deletions libtess.cat.js
Original file line number Diff line number Diff line change
Expand Up @@ -3586,10 +3586,11 @@ libtess.GluTesselator.prototype.gluTessNormal = function(x, y, z) {


/**
* Specify callbacks. See README. A null or undefined opt_fn removes current callback.
* Specify callbacks. See README. A null or undefined opt_fn removes current
* callback.
*
* @param {libtess.gluEnum} which [description].
* @param {?Function=} opt_fn [description].
* @param {libtess.gluEnum} which The callback-type gluEnum value.
* @param {?Function=} opt_fn
*/
libtess.GluTesselator.prototype.gluTessCallback = function(which, opt_fn) {
var fn = !opt_fn ? null : opt_fn;
Expand Down
7 changes: 4 additions & 3 deletions libtess.debug.js
Original file line number Diff line number Diff line change
Expand Up @@ -3626,10 +3626,11 @@ libtess.GluTesselator.prototype.gluTessNormal = function(x, y, z) {


/**
* Specify callbacks. See README. A null or undefined opt_fn removes current callback.
* Specify callbacks. See README. A null or undefined opt_fn removes current
* callback.
*
* @param {libtess.gluEnum} which [description].
* @param {?Function=} opt_fn [description].
* @param {libtess.gluEnum} which The callback-type gluEnum value.
* @param {?Function=} opt_fn
*/
libtess.GluTesselator.prototype.gluTessCallback = function(which, opt_fn) {
var fn = !opt_fn ? null : opt_fn;
Expand Down
7 changes: 4 additions & 3 deletions src/libtess/GluTesselator.js
Original file line number Diff line number Diff line change
Expand Up @@ -364,10 +364,11 @@ libtess.GluTesselator.prototype.gluTessNormal = function(x, y, z) {


/**
* Specify callbacks. See README. A null or undefined opt_fn removes current callback.
* Specify callbacks. See README. A null or undefined opt_fn removes current
* callback.
*
* @param {libtess.gluEnum} which [description].
* @param {?Function=} opt_fn [description].
* @param {libtess.gluEnum} which The callback-type gluEnum value.
* @param {?Function=} opt_fn
*/
libtess.GluTesselator.prototype.gluTessCallback = function(which, opt_fn) {
var fn = !opt_fn ? null : opt_fn;
Expand Down
166 changes: 166 additions & 0 deletions test/basics.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,172 @@ suite('Basic Tests', function() {
});
});

suite('Polygon data and callbacks', function() {
// Tessellation without data callbacks.
var noDataArguments = {
begin: -1,
vertex: -1,
edge: -1,
combine: -1,
end: -1
};

var noDataVerts = [];
function beginCallback(type) {
noDataArguments.begin = arguments.length;
}
function vertexCallback(vertData) {
noDataArguments.vertex = arguments.length;
noDataVerts.push(vertData[0], vertData[1], vertData[2]);
}
function edgeCallback(flag) {
noDataArguments.edge = arguments.length;
}
function combineCallback(coords, vertData, weight) {
noDataArguments.combine = arguments.length;
return [coords[0], coords[1], coords[2]];
}
function endCallback() {
noDataArguments.end = arguments.length;
}

var noTess = new libtess.GluTesselator();
noTess.gluTessCallback(libtess.gluEnum.GLU_TESS_BEGIN, beginCallback);
noTess.gluTessCallback(libtess.gluEnum.GLU_TESS_VERTEX, vertexCallback);
noTess.gluTessCallback(libtess.gluEnum.GLU_TESS_END, endCallback);
noTess.gluTessCallback(libtess.gluEnum.GLU_TESS_COMBINE, combineCallback);
noTess.gluTessCallback(libtess.gluEnum.GLU_TESS_EDGE_FLAG, edgeCallback);
noTess.gluTessProperty(libtess.gluEnum.GLU_TESS_BOUNDARY_ONLY, false);
noTess.gluTessCallback(libtess.gluEnum.GLU_TESS_ERROR, function(err) {
throw new Error(common.ERROR_TYPES_[err]);
});

test('correct tessellation with no polygon data callbacks', function() {
noTess.gluTessBeginPolygon();
noTess.gluTessBeginContour();
noTess.gluTessVertex([1, 0, 0], [1, 0, 0]);
noTess.gluTessVertex([0, 1, 0], [0, 1, 0]);
noTess.gluTessVertex([1, 1, 0], [1, 1, 0]);
noTess.gluTessVertex([0, 0, 0], [0, 0, 0]);
noTess.gluTessEndContour();
noTess.gluTessEndPolygon();
assert.deepEqual(noDataVerts,
[1, 0, 0, 0.5, 0.5, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0.5, 0.5, 0],
'hourglass was not tessellated correctly in polygon no-data test');
});

// Tessellation with data callbacks.
var dataArguments = {
begin: -1,
vertex: -1,
edge: -1,
combine: -1,
end: -1
};

var dataVerts = [];
function beginDataCallback(type, data) {
dataArguments.begin = arguments.length;
assert.strictEqual(data, dataVerts,
'GLU_TESS_BEGIN_DATA callback data incorrect');
}
function vertexDataCallback(vertData, data) {
dataArguments.vertex = arguments.length;
data.push(vertData[0], vertData[1], vertData[2]);
assert.strictEqual(data, dataVerts,
'GLU_TESS_VERTEX_DATA callback data incorrect');
}
function edgeDataCallback(flag, data) {
dataArguments.edge = arguments.length;
assert.strictEqual(data, dataVerts,
'GLU_TESS_EDGE_FLAG_DATA callback data incorrect');
}
function combineDataCallback(coords, vertData, weight, data) {
dataArguments.combine = arguments.length;
assert.strictEqual(data, dataVerts,
'GLU_TESS_COMBINE_DATA callback data incorrect');
return [coords[0], coords[1], coords[2]];
}
function endDataCallback(data) {
dataArguments.end = arguments.length;
assert.strictEqual(data, dataVerts,
'GLU_TESS_END_DATA callback data incorrect');
}

var tess = new libtess.GluTesselator();
tess.gluTessCallback(libtess.gluEnum.GLU_TESS_BEGIN_DATA,
beginDataCallback);
tess.gluTessCallback(libtess.gluEnum.GLU_TESS_VERTEX_DATA,
vertexDataCallback);
tess.gluTessCallback(libtess.gluEnum.GLU_TESS_END_DATA,
endDataCallback);
tess.gluTessCallback(libtess.gluEnum.GLU_TESS_COMBINE_DATA,
combineDataCallback);
tess.gluTessCallback(libtess.gluEnum.GLU_TESS_EDGE_FLAG_DATA,
edgeDataCallback);
tess.gluTessProperty(libtess.gluEnum.GLU_TESS_BOUNDARY_ONLY, false);
noTess.gluTessCallback(libtess.gluEnum.GLU_TESS_ERROR, function(err) {
throw new Error(common.ERROR_TYPES_[err]);
});

test('correct tessellation with polygon data callbacks', function() {
tess.gluTessBeginPolygon(dataVerts);
tess.gluTessBeginContour();
tess.gluTessVertex([1, 0, 0], [1, 0, 0]);
tess.gluTessVertex([0, 1, 0], [0, 1, 0]);
tess.gluTessVertex([1, 1, 0], [1, 1, 0]);
tess.gluTessVertex([0, 0, 0], [0, 0, 0]);
tess.gluTessEndContour();
tess.gluTessEndPolygon();

assert.deepEqual(dataVerts,
[1, 0, 0, 0.5, 0.5, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0.5, 0.5, 0],
'hourglass was not tessellated correctly in polygon data test');
});

// Check argument counts.
test('begin callback should return with and without data', function() {
assert.strictEqual(noDataArguments.begin, 1,
'GLU_TESS_BEGIN callback called with ' + noDataArguments.begin +
' arguments');
assert.strictEqual(dataArguments.begin, 2,
'GLU_TESS_BEGIN_DATA callback called with ' + dataArguments.begin +
' arguments');
});
test('vertex callback should return with and without data', function() {
assert.strictEqual(noDataArguments.vertex, 1,
'GLU_TESS_VERTEX callback called with ' + noDataArguments.vertex +
' arguments');
assert.strictEqual(dataArguments.vertex, 2,
'GLU_TESS_VERTEX_DATA callback called with ' + dataArguments.vertex +
' arguments');
});
test('edge flag callback should return with and without data', function() {
assert.strictEqual(noDataArguments.edge, 1,
'GLU_TESS_EDGE_FLAG callback called with ' + noDataArguments.edge +
' arguments');
assert.strictEqual(dataArguments.edge, 2,
'GLU_TESS_EDGE_FLAG_DATA callback called with ' + dataArguments.edge +
' arguments');
});
test('combine callback should return with and without data', function() {
assert.strictEqual(noDataArguments.combine, 3,
'GLU_TESS_COMBINE callback called with ' + noDataArguments.combine +
' arguments');
assert.strictEqual(dataArguments.combine, 4,
'GLU_TESS_COMBINE_DATA callback called with ' + dataArguments.combine +
' arguments');
});
test('end callback should return with and without data', function() {
assert.strictEqual(noDataArguments.end, 0,
'GLU_TESS_END callback called with ' + noDataArguments.end +
' arguments');
assert.strictEqual(dataArguments.end, 1,
'GLU_TESS_END_DATA callback called with ' + dataArguments.end +
' arguments');
});
});

suite('Basic Geometry', function() {
test('no points should return an empty result', function() {
var tess = createTessellator(libtess);
Expand Down
166 changes: 166 additions & 0 deletions test/browser/tests-browserified.js
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,172 @@ suite('Basic Tests', function() {
});
});

suite('Polygon data and callbacks', function() {
// Tessellation without data callbacks.
var noDataArguments = {
begin: -1,
vertex: -1,
edge: -1,
combine: -1,
end: -1
};

var noDataVerts = [];
function beginCallback(type) {
noDataArguments.begin = arguments.length;
}
function vertexCallback(vertData) {
noDataArguments.vertex = arguments.length;
noDataVerts.push(vertData[0], vertData[1], vertData[2]);
}
function edgeCallback(flag) {
noDataArguments.edge = arguments.length;
}
function combineCallback(coords, vertData, weight) {
noDataArguments.combine = arguments.length;
return [coords[0], coords[1], coords[2]];
}
function endCallback() {
noDataArguments.end = arguments.length;
}

var noTess = new libtess.GluTesselator();
noTess.gluTessCallback(libtess.gluEnum.GLU_TESS_BEGIN, beginCallback);
noTess.gluTessCallback(libtess.gluEnum.GLU_TESS_VERTEX, vertexCallback);
noTess.gluTessCallback(libtess.gluEnum.GLU_TESS_END, endCallback);
noTess.gluTessCallback(libtess.gluEnum.GLU_TESS_COMBINE, combineCallback);
noTess.gluTessCallback(libtess.gluEnum.GLU_TESS_EDGE_FLAG, edgeCallback);
noTess.gluTessProperty(libtess.gluEnum.GLU_TESS_BOUNDARY_ONLY, false);
noTess.gluTessCallback(libtess.gluEnum.GLU_TESS_ERROR, function(err) {
throw new Error(common.ERROR_TYPES_[err]);
});

test('correct tessellation with no polygon data callbacks', function() {
noTess.gluTessBeginPolygon();
noTess.gluTessBeginContour();
noTess.gluTessVertex([1, 0, 0], [1, 0, 0]);
noTess.gluTessVertex([0, 1, 0], [0, 1, 0]);
noTess.gluTessVertex([1, 1, 0], [1, 1, 0]);
noTess.gluTessVertex([0, 0, 0], [0, 0, 0]);
noTess.gluTessEndContour();
noTess.gluTessEndPolygon();
assert.deepEqual(noDataVerts,
[1, 0, 0, 0.5, 0.5, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0.5, 0.5, 0],
'hourglass was not tessellated correctly in polygon no-data test');
});

// Tessellation with data callbacks.
var dataArguments = {
begin: -1,
vertex: -1,
edge: -1,
combine: -1,
end: -1
};

var dataVerts = [];
function beginDataCallback(type, data) {
dataArguments.begin = arguments.length;
assert.strictEqual(data, dataVerts,
'GLU_TESS_BEGIN_DATA callback data incorrect');
}
function vertexDataCallback(vertData, data) {
dataArguments.vertex = arguments.length;
data.push(vertData[0], vertData[1], vertData[2]);
assert.strictEqual(data, dataVerts,
'GLU_TESS_VERTEX_DATA callback data incorrect');
}
function edgeDataCallback(flag, data) {
dataArguments.edge = arguments.length;
assert.strictEqual(data, dataVerts,
'GLU_TESS_EDGE_FLAG_DATA callback data incorrect');
}
function combineDataCallback(coords, vertData, weight, data) {
dataArguments.combine = arguments.length;
assert.strictEqual(data, dataVerts,
'GLU_TESS_COMBINE_DATA callback data incorrect');
return [coords[0], coords[1], coords[2]];
}
function endDataCallback(data) {
dataArguments.end = arguments.length;
assert.strictEqual(data, dataVerts,
'GLU_TESS_END_DATA callback data incorrect');
}

var tess = new libtess.GluTesselator();
tess.gluTessCallback(libtess.gluEnum.GLU_TESS_BEGIN_DATA,
beginDataCallback);
tess.gluTessCallback(libtess.gluEnum.GLU_TESS_VERTEX_DATA,
vertexDataCallback);
tess.gluTessCallback(libtess.gluEnum.GLU_TESS_END_DATA,
endDataCallback);
tess.gluTessCallback(libtess.gluEnum.GLU_TESS_COMBINE_DATA,
combineDataCallback);
tess.gluTessCallback(libtess.gluEnum.GLU_TESS_EDGE_FLAG_DATA,
edgeDataCallback);
tess.gluTessProperty(libtess.gluEnum.GLU_TESS_BOUNDARY_ONLY, false);
noTess.gluTessCallback(libtess.gluEnum.GLU_TESS_ERROR, function(err) {
throw new Error(common.ERROR_TYPES_[err]);
});

test('correct tessellation with polygon data callbacks', function() {
tess.gluTessBeginPolygon(dataVerts);
tess.gluTessBeginContour();
tess.gluTessVertex([1, 0, 0], [1, 0, 0]);
tess.gluTessVertex([0, 1, 0], [0, 1, 0]);
tess.gluTessVertex([1, 1, 0], [1, 1, 0]);
tess.gluTessVertex([0, 0, 0], [0, 0, 0]);
tess.gluTessEndContour();
tess.gluTessEndPolygon();

assert.deepEqual(dataVerts,
[1, 0, 0, 0.5, 0.5, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0.5, 0.5, 0],
'hourglass was not tessellated correctly in polygon data test');
});

// Check argument counts.
test('begin callback should return with and without data', function() {
assert.strictEqual(noDataArguments.begin, 1,
'GLU_TESS_BEGIN callback called with ' + noDataArguments.begin +
' arguments');
assert.strictEqual(dataArguments.begin, 2,
'GLU_TESS_BEGIN_DATA callback called with ' + dataArguments.begin +
' arguments');
});
test('vertex callback should return with and without data', function() {
assert.strictEqual(noDataArguments.vertex, 1,
'GLU_TESS_VERTEX callback called with ' + noDataArguments.vertex +
' arguments');
assert.strictEqual(dataArguments.vertex, 2,
'GLU_TESS_VERTEX_DATA callback called with ' + dataArguments.vertex +
' arguments');
});
test('edge flag callback should return with and without data', function() {
assert.strictEqual(noDataArguments.edge, 1,
'GLU_TESS_EDGE_FLAG callback called with ' + noDataArguments.edge +
' arguments');
assert.strictEqual(dataArguments.edge, 2,
'GLU_TESS_EDGE_FLAG_DATA callback called with ' + dataArguments.edge +
' arguments');
});
test('combine callback should return with and without data', function() {
assert.strictEqual(noDataArguments.combine, 3,
'GLU_TESS_COMBINE callback called with ' + noDataArguments.combine +
' arguments');
assert.strictEqual(dataArguments.combine, 4,
'GLU_TESS_COMBINE_DATA callback called with ' + dataArguments.combine +
' arguments');
});
test('end callback should return with and without data', function() {
assert.strictEqual(noDataArguments.end, 0,
'GLU_TESS_END callback called with ' + noDataArguments.end +
' arguments');
assert.strictEqual(dataArguments.end, 1,
'GLU_TESS_END_DATA callback called with ' + dataArguments.end +
' arguments');
});
});

suite('Basic Geometry', function() {
test('no points should return an empty result', function() {
var tess = createTessellator(libtess);
Expand Down

0 comments on commit 16bd2cf

Please sign in to comment.