///
export import mocha = require('../../test/mocha');
var expect = mocha.chai.expect;
var spy = mocha.sinon.spy;
var mock = mocha.mock;
var rcsdk = mocha.rcsdk;
describe('RCSDK.core.List', function() {
'use strict';
var List = rcsdk.getList();
describe('stringComparator', function() {
it('compares values as strings', function() {
// numbers with different amount of digits
expect(List.stringComparator('12', '2')).to.equal(-1);
expect(List.stringComparator('2', '12')).to.equal(1);
// numbers with same amount of digits
expect(List.stringComparator('1', '2')).to.equal(-1);
expect(List.stringComparator('2', '1')).to.equal(1);
// same numbers
expect(List.stringComparator('1', '1')).to.equal(0);
// english strings
expect(List.stringComparator('a', 'b')).to.equal(-1);
expect(List.stringComparator('b', 'a')).to.equal(1);
expect(List.stringComparator('a', 'a')).to.equal(0);
// russian strings
expect(List.stringComparator('в', 'г')).to.equal(-1);
expect(List.stringComparator('г', 'в')).to.equal(1);
expect(List.stringComparator('г', 'г')).to.equal(0);
});
it('compares values as numbers', function() {
// numbers with different amount of digits as strings, is used to convince TS
expect(List.numberComparator('12', '2')).to.equal(10);
expect(List.numberComparator('2', '12')).to.equal(-10);
// numbers with different amount of digits
expect(List.numberComparator(12, 2)).to.equal(10);
expect(List.numberComparator(2, 12)).to.equal(-10);
// numbers with same amount of digits
expect(List.numberComparator(1, 2)).to.equal(-1);
expect(List.numberComparator(2, 1)).to.equal(1);
// same numbers
expect(List.numberComparator(1, 1)).to.equal(0);
});
});
describe('comparator', function() {
it('by default provides comparator function which calls stringComparator with pre-bound extract functions', function() {
var array = [
{id: '3'},
{id: '2'},
{id: '1'}
],
sortFn = List.comparator({sortBy: 'id'}),
result = array
.map(function(item) {return item;}) // we need a copy, original array is sorted in-place
.sort(sortFn);
expect(result[0]).to.equal(array[2]);
expect(result[1]).to.equal(array[1]);
expect(result[2]).to.equal(array[0]);
});
it('allows to provide custom sortBy property', function() {
var array = [
{name: '3'},
{name: '2'},
{name: '1'}
],
sortFn = List.comparator({sortBy: 'name'}),
result = array
.map(function(item) {return item;}) // we need a copy, original array is sorted in-place
.sort(sortFn);
expect(result[0]).to.equal(array[2]);
expect(result[1]).to.equal(array[1]);
expect(result[2]).to.equal(array[0]);
});
it('allows to provide custom extract and compare functions', function() {
var array = [
{id: '13'},
{id: '2'},
{id: '1'}
],
sortFn = List.comparator({
compareFn: List.numberComparator,
sortBy: 'id'
}),
result = array
.map(function(item) {return item;}) // we need a copy, original array is sorted in-place
.sort(sortFn);
expect(result[0]).to.equal(array[2]);
expect(result[1]).to.equal(array[1]);
expect(result[2]).to.equal(array[0]);
});
it('provides options to custom extract and compare functions', function() {
var array = [
{id: '3'},
{id: '2'},
{id: '1'}
],
options = {
sortBy: 'id',
extractFn: spy(function(item, opts) {
expect(opts.extractFn).to.equal(options.extractFn);
expect(opts.compareFn).to.equal(options.compareFn);
return List.propertyExtractor('id')(item, opts);
}),
compareFn: spy(function(a, b, opts) {
expect(opts.extractFn).to.equal(options.extractFn);
expect(opts.compareFn).to.equal(options.compareFn);
return List.numberComparator(a, b, opts);
})
},
sortFn = List.comparator(options),
result = array
.map(function(item) {return item;}) // we need a copy, original array is sorted in-place
.sort(sortFn);
expect(result[0]).to.equal(array[2]);
expect(result[1]).to.equal(array[1]);
expect(result[2]).to.equal(array[0]);
expect((options.extractFn).callCount).to.be.equal(array.length * 2);
expect((options.compareFn).callCount).to.be.equal(array.length);
});
});
describe('propertyExtractor', function() {
it('returns a value of property', function() {
expect((List.propertyExtractor('id'))({id: 'foo'})).to.equal('foo');
expect((List.propertyExtractor('id'))(undefined)).to.equal(null);
expect((List.propertyExtractor(null))('foo')).to.equal('foo');
expect((List.propertyExtractor(null))({id: 'foo'})).to.deep.equal({id: 'foo'});
});
});
});