Skip to content

Commit

Permalink
Add tests for missing modules in @turf/turf
Browse files Browse the repository at this point in the history
  • Loading branch information
DenisCarriere committed Sep 18, 2017
1 parent b9d1cf8 commit 00cc41f
Show file tree
Hide file tree
Showing 10 changed files with 249 additions and 133 deletions.
111 changes: 4 additions & 107 deletions packages/turf-clusters/index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
var featureEach = require('@turf/meta').featureEach;
var featureCollection = require('@turf/helpers').featureCollection;
var utils = require('./utils');
var applyFilter = utils.applyFilter;
var createBins = utils.createBins;

/**
* Get Cluster
Expand Down Expand Up @@ -186,114 +189,8 @@ function clusterReduce(geojson, property, callback, initialValue) {
return previousValue;
}

/**
* Create Bins
*
* @private
* @param {FeatureCollection} geojson GeoJSON Features
* @param {string|number} property Property values are used to create bins
* @returns {Object} bins with Feature IDs
* @example
* const geojson = turf.featureCollection([
* turf.point([0, 0], {cluster: 0, foo: 'null'}),
* turf.point([2, 4], {cluster: 1, foo: 'bar'}),
* turf.point([5, 1], {0: 'foo'}),
* turf.point([3, 6], {cluster: 1}),
* ]);
* createBins(geojson, 'cluster');
* //= { '0': [ 0 ], '1': [ 1, 3 ] }
*/
function createBins(geojson, property) {
var bins = {};

featureEach(geojson, function (feature, i) {
var properties = feature.properties || {};
if (properties.hasOwnProperty(property)) {
var value = properties[property];
if (bins.hasOwnProperty(value)) bins[value].push(i);
else bins[value] = [i];
}
});
return bins;
}

/**
* Apply Filter
*
* @private
* @param {*} properties Properties
* @param {*} filter Filter
* @returns {Boolean} applied Filter to properties
*/
function applyFilter(properties, filter) {
if (properties === undefined) return false;
var filterType = typeof filter;

// String & Number
if (filterType === 'number' || filterType === 'string') return properties.hasOwnProperty(filter);
// Array
else if (Array.isArray(filter)) {
for (var i = 0; i < filter.length; i++) {
if (!applyFilter(properties, filter[i])) return false;
}
return true;
// Object
} else {
return propertiesContainsFilter(properties, filter);
}
}

/**
* Properties contains filter (does not apply deepEqual operations)
*
* @private
* @param {*} properties Properties
* @param {Object} filter Filter
* @returns {Boolean} does filter equal Properties
* @example
* propertiesContainsFilter({foo: 'bar', cluster: 0}, {cluster: 0})
* //= true
* propertiesContainsFilter({foo: 'bar', cluster: 0}, {cluster: 1})
* //= false
*/
function propertiesContainsFilter(properties, filter) {
var keys = Object.keys(filter);
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
if (properties[key] !== filter[key]) return false;
}
return true;
}

/**
* Filter Properties
*
* @private
* @param {*} properties Properties
* @param {string[]} keys Used to filter Properties
* @returns {*} filtered Properties
* @example
* filterProperties({foo: 'bar', cluster: 0}, ['cluster'])
* //= {cluster: 0}
*/
function filterProperties(properties, keys) {
if (!keys) return {};
if (!keys.length) return {};

var newProperties = {};
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
if (properties.hasOwnProperty(key)) newProperties[key] = properties[key];
}
return newProperties;
}

module.exports = {
getCluster: getCluster,
clusterEach: clusterEach,
clusterReduce: clusterReduce,
createBins: createBins, // Not exposed in @turf/turf - Internal purposes only
applyFilter: applyFilter, // Not exposed in @turf/turf - Internal purposes only
propertiesContainsFilter: propertiesContainsFilter, // Not exposed in @turf/turf - Internal purposes only
filterProperties: filterProperties // Not exposed in @turf/turf - Internal purposes only
clusterReduce: clusterReduce
};
3 changes: 2 additions & 1 deletion packages/turf-clusters/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
"types": "index.d.ts",
"files": [
"index.js",
"index.d.ts"
"index.d.ts",
"utils.js"
],
"scripts": {
"test": "node test.js",
Expand Down
23 changes: 13 additions & 10 deletions packages/turf-clusters/test.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
const test = require('tape');
const {featureCollection, point} = require('@turf/helpers');
const {propertiesContainsFilter, filterProperties, applyFilter, createBins} = require('./'); // Testing Purposes
const {getCluster, clusterEach, clusterReduce} = require('./');
const {
propertiesContainsFilter,
filterProperties,
applyFilter,
createBins} = require('./utils');
const {
getCluster,
clusterEach,
clusterReduce} = require('./');

const properties = {foo: 'bar', cluster: 0};
const geojson = featureCollection([
Expand Down Expand Up @@ -51,8 +58,7 @@ test('clusters -- clusterReduce', t => {
t.end();
});

// Internal purposes only
test('clusters -- applyFilter', t => {
test('clusters.utils -- applyFilter', t => {
t.true(applyFilter(properties, 'cluster'));
t.true(applyFilter(properties, ['cluster']));
t.false(applyFilter(properties, {cluster: 1}));
Expand All @@ -61,24 +67,21 @@ test('clusters -- applyFilter', t => {
t.end();
});

// Internal purposes only
test('clusters -- filterProperties', t => {
test('clusters.utils -- filterProperties', t => {
t.deepEqual(filterProperties(properties, ['cluster']), {cluster: 0});
t.deepEqual(filterProperties(properties, []), {});
t.deepEqual(filterProperties(properties, undefined), {});
t.end();
});

// Internal purposes only
test('clusters -- propertiesContainsFilter', t => {
test('clusters.utils -- propertiesContainsFilter', t => {
t.deepEqual(propertiesContainsFilter(properties, {cluster: 0}), true);
t.deepEqual(propertiesContainsFilter(properties, {cluster: 1}), false);
t.deepEqual(propertiesContainsFilter(properties, {bar: 'foo'}), false);
t.end();
});

// Internal purposes only
test('clusters -- propertiesContainsFilter', t => {
test('clusters.utils -- propertiesContainsFilter', t => {
t.deepEqual(createBins(geojson, 'cluster'), {'0': [0], '1': [1, 2]});
t.end();
});
110 changes: 110 additions & 0 deletions packages/turf-clusters/utils.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
var featureEach = require('@turf/meta').featureEach;

/**
* Create Bins
*
* @private
* @param {FeatureCollection} geojson GeoJSON Features
* @param {string|number} property Property values are used to create bins
* @returns {Object} bins with Feature IDs
* @example
* const geojson = turf.featureCollection([
* turf.point([0, 0], {cluster: 0, foo: 'null'}),
* turf.point([2, 4], {cluster: 1, foo: 'bar'}),
* turf.point([5, 1], {0: 'foo'}),
* turf.point([3, 6], {cluster: 1}),
* ]);
* createBins(geojson, 'cluster');
* //= { '0': [ 0 ], '1': [ 1, 3 ] }
*/
function createBins(geojson, property) {
var bins = {};

featureEach(geojson, function (feature, i) {
var properties = feature.properties || {};
if (properties.hasOwnProperty(property)) {
var value = properties[property];
if (bins.hasOwnProperty(value)) bins[value].push(i);
else bins[value] = [i];
}
});
return bins;
}

/**
* Apply Filter
*
* @private
* @param {*} properties Properties
* @param {*} filter Filter
* @returns {Boolean} applied Filter to properties
*/
function applyFilter(properties, filter) {
if (properties === undefined) return false;
var filterType = typeof filter;

// String & Number
if (filterType === 'number' || filterType === 'string') return properties.hasOwnProperty(filter);
// Array
else if (Array.isArray(filter)) {
for (var i = 0; i < filter.length; i++) {
if (!applyFilter(properties, filter[i])) return false;
}
return true;
// Object
} else {
return propertiesContainsFilter(properties, filter);
}
}

/**
* Properties contains filter (does not apply deepEqual operations)
*
* @private
* @param {*} properties Properties
* @param {Object} filter Filter
* @returns {Boolean} does filter equal Properties
* @example
* propertiesContainsFilter({foo: 'bar', cluster: 0}, {cluster: 0})
* //= true
* propertiesContainsFilter({foo: 'bar', cluster: 0}, {cluster: 1})
* //= false
*/
function propertiesContainsFilter(properties, filter) {
var keys = Object.keys(filter);
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
if (properties[key] !== filter[key]) return false;
}
return true;
}

/**
* Filter Properties
*
* @private
* @param {*} properties Properties
* @param {string[]} keys Used to filter Properties
* @returns {*} filtered Properties
* @example
* filterProperties({foo: 'bar', cluster: 0}, ['cluster'])
* //= {cluster: 0}
*/
function filterProperties(properties, keys) {
if (!keys) return {};
if (!keys.length) return {};

var newProperties = {};
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
if (properties.hasOwnProperty(key)) newProperties[key] = properties[key];
}
return newProperties;
}

module.exports = {
createBins: createBins,
applyFilter: applyFilter,
propertiesContainsFilter: propertiesContainsFilter,
filterProperties: filterProperties
};
34 changes: 31 additions & 3 deletions packages/turf/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,17 @@ import {
lineEach, // v4.7.0
lineReduce // v4.7.0
} from '@turf/meta';
import * as clusters from '@turf/clusters'; // v4.6.0
import {
clusterEach,
clusterReduce,
getCluster
} from '@turf/clusters'; // v4.6.0
import * as projection from '@turf/projection'; // v4.7.0
import {
toMercator,
toWgs84
} from '@turf/projection'; // v4.7.0
import * as isolines from '@turf/isolines';
import * as convex from '@turf/convex';
import * as within from '@turf/within';
Expand Down Expand Up @@ -134,6 +145,11 @@ import * as cleanCoords from '@turf/clean-coords';
import * as pointToLineDistance from '@turf/point-to-line-distance'; // v4.7.0
import * as booleanParallel from '@turf/boolean-parallel'; // v4.8.0
import * as nearestPointToLine from '@turf/nearest-point-to-line'; // v4.8.0
import * as clustersDbscan from '@turf/clusters-dbscan'; // v4.6.0
import * as clustersKmeans from '@turf/clusters-kmeans'; // v4.6.0
import * as interpolate from '@turf/interpolate'; // v4.6.0
import * as booleanPointOnLine from '@turf/boolean-point-on-line' // v4.6.0
import * as booleanOverlap from '@turf/boolean-overlap' // v4.6.0
export {
isolines,
convex,
Expand Down Expand Up @@ -256,7 +272,7 @@ export {
clone,
segmentEach,
segmentReduce,
cleanCoords,
cleanCoords, // v4.6.0
isNumber,
pointToLineDistance, // v4.7.0
helpers,
Expand All @@ -266,5 +282,17 @@ export {
lineReduce, // v4.7.0
getType, // v4.8.0
booleanParallel, // v4.8.0
nearestPointToLine // v4.8.0
};
nearestPointToLine, // v4.8.0
clusters, // v4.6.0
clustersDbscan, // v4.6.0
clustersKmeans, // v4.6.0
clusterEach, // v4.6.0
clusterReduce, // v4.6.0
getCluster, // v4.6.0
interpolate, // v4.6.0
booleanPointOnLine, // v4.6.0
booleanOverlap, // v4.6.0
projection, // v4.7.0
toMercator, // v4.7.0
toWgs84 // v4.7.0
};
8 changes: 8 additions & 0 deletions packages/turf/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ var helpers = require('@turf/helpers');
var invariant = require('@turf/invariant');
var meta = require('@turf/meta');
var clusters = require('@turf/clusters');
var projection = require('@turf/projection'); // v4.7.0

var turf = {
isolines: require('@turf/isolines'),
Expand Down Expand Up @@ -103,9 +104,14 @@ var turf = {
pointToLineDistance: require('@turf/point-to-line-distance'), // v4.7.0
booleanParallel: require('@turf/boolean-parallel'), // v4.8.0
nearestPointToLine: require('@turf/nearest-point-to-line'), // v4.8.0
projection: projection, // v4.7.0
toMercator: projection.toMercator, // v4.7.0
toWgs84: projection.toWgs84, // v4.7.0
clusters: clusters, // v4.6.0
getCluster: clusters.getCluster, // v4.6.0
clusterEach: clusters.clusterEach, // v4.6.0
clusterReduce: clusters.clusterReduce, // v4.6.0
helpers: helpers,
point: helpers.point,
polygon: helpers.polygon,
lineString: helpers.lineString,
Expand All @@ -126,6 +132,7 @@ var turf = {
isNumber: helpers.isNumber, // 4.7.0
round: helpers.round,
convertArea: helpers.convertArea,
invariant: invariant,
getCoord: invariant.getCoord,
getCoords: invariant.getCoords,
geojsonType: invariant.geojsonType,
Expand All @@ -135,6 +142,7 @@ var turf = {
getType: invariant.getType, // v4.8.0
getGeom: invariant.getGeom,
getGeomType: invariant.getGeomType,
meta: meta,
coordEach: meta.coordEach,
coordReduce: meta.coordReduce,
propEach: meta.propEach,
Expand Down
Loading

0 comments on commit 00cc41f

Please sign in to comment.