can-query-logic
Version:
498 lines (391 loc) • 11.2 kB
JavaScript
var QUnit = require("steal-qunit");
var makeMaybe = require("./make-maybe");
var is = require("./comparisons");
var set = require("../set");
var canReflect = require("can-reflect");
QUnit.module("can-query-logic/types/make-maybe");
function DateStringSet(value) {
this.value = value;
}
DateStringSet.prototype.valueOf = function() {
return this.value == null ? this.value : new Date(this.value).getTime();
};
var ComparisonSet = function(value) {
this.value = value;
};
ComparisonSet.prototype.valueOf = function() {
return this.value;
};
var MaybeDateStringSet = makeMaybe([null, undefined], DateStringSet);
QUnit.test("constructor normalizes", function(assert) {
var isNull_3 = new MaybeDateStringSet({
range: new is.In([null, 3])
});
assert.deepEqual(isNull_3.range, new is.In([3]), "3 left in range");
assert.deepEqual(isNull_3.enum, new is.In([null]), "range moved to in");
// with value of values
var isNull_3AsDateString = new MaybeDateStringSet({
range: new is.In([new DateStringSet(null), new DateStringSet(3)])
});
assert.deepEqual(isNull_3AsDateString.range, new is.In([new DateStringSet(3)]), "3 left in range");
assert.deepEqual(isNull_3AsDateString.enum, new is.In([new DateStringSet(null)]), "range moved to in");
var isNull = new MaybeDateStringSet({
range: new is.In([null])
});
assert.deepEqual(isNull.range, set.EMPTY, "empty if only null");
assert.deepEqual(isNull.enum, new is.In([null]), "range moved to in");
var res = new MaybeDateStringSet({
range: new is.NotIn([null, 3])
});
assert.deepEqual(res.range, new is.NotIn([3]), "not in range");
assert.deepEqual(res.enum, new is.In([undefined]), "not in enum");
res = new MaybeDateStringSet({
range: new is.And([
new is.NotIn([null]),
new is.GreaterThan(4)
])
});
assert.deepEqual(res.range, new is.GreaterThan(4), "And with not in");
assert.deepEqual(res.enum, set.EMPTY, "And with not in");
});
QUnit.test("difference with universal", function(assert) {
var res;
var gt3 = new MaybeDateStringSet({
range: new is.GreaterThan(3)
});
res = set.difference(set.UNIVERSAL, gt3);
assert.deepEqual(res, new MaybeDateStringSet({
enum: new is.In([null, undefined]),
range: new is.LessThanEqual(3)
}), "UNIVERSAL \\ $gt:3");
res = set.difference(set.UNIVERSAL,
new MaybeDateStringSet({
range: new is.In([null])
})
);
assert.deepEqual(res, new MaybeDateStringSet({
range: set.UNIVERSAL,
enum: new is.In([undefined])
}), "UNIVERSAL \\ null");
res = set.difference(set.UNIVERSAL,
new MaybeDateStringSet({
range: new is.NotIn([null])
})
);
assert.deepEqual(res, new MaybeDateStringSet({
range: set.UNIVERSAL,
enum: new is.In([null])
}), "UNIVERSAL \\ !null");
res = set.difference(set.UNIVERSAL,
new MaybeDateStringSet({
enum: new is.In([null, undefined]),
range: new is.LessThanEqual(3)
})
);
assert.deepEqual(res, gt3, "secondary and primary");
});
QUnit.test("difference", function(assert) {
var res;
var gt3 = new MaybeDateStringSet({
range: new is.GreaterThan(3)
});
res = set.difference(
new MaybeDateStringSet({
range: new is.GreaterThan(3)
}),
new MaybeDateStringSet({
range: new is.GreaterThan(4)
}));
assert.deepEqual(res, new MaybeDateStringSet({
range: set.difference(new is.GreaterThan(3), new is.GreaterThan(4))
}), "$gt:3 \\ $gt:4");
res = set.difference(
new MaybeDateStringSet({
range: new is.NotIn([undefined])
}),
new MaybeDateStringSet({
range: new is.LessThanEqual(3),
enum: new is.In([null])
})
);
assert.deepEqual(res, new MaybeDateStringSet({
range: new is.GreaterThan(3)
}), "{ne: undef} \\ {lt: 3} | null -> {gte: 3}");
res = set.difference(
new MaybeDateStringSet({
range: new is.NotIn([undefined])
}),
new MaybeDateStringSet({
range: new is.LessThanEqual(3)
})
);
assert.deepEqual(res, new MaybeDateStringSet({
range: new is.GreaterThan(3),
enum: new is.In([null])
}), "{ne: undef} \\ {lt: 3}|null -> {gte: 3} | null");
res = set.difference(set.UNIVERSAL,
new MaybeDateStringSet({
range: new is.In([null])
})
);
assert.deepEqual(res, new MaybeDateStringSet({
range: new is.NotIn([null])
}), "UNIVERSAL \\ null");
res = set.difference(set.UNIVERSAL,
new MaybeDateStringSet({
enum: new is.In([null, undefined]),
range: new is.LessThanEqual(3)
})
);
assert.deepEqual(res, gt3, "secondary and primary");
res = set.difference(
new MaybeDateStringSet({
range: new is.In([3]),
enum: set.EMPTY
}),
new MaybeDateStringSet({
range: new is.In([3]),
enum: set.EMPTY
})
);
assert.equal(res, set.EMPTY, "equal is empty");
});
QUnit.test("difference with ComparisonSet", function(assert) {
var three = new ComparisonSet(3),
four = new ComparisonSet(3);
var res;
var gt3 = new MaybeDateStringSet({
range: new is.GreaterThan(three)
});
res = set.difference(
new MaybeDateStringSet({
range: new is.GreaterThan(three)
}),
new MaybeDateStringSet({
range: new is.GreaterThan(four)
}));
assert.deepEqual(res, new MaybeDateStringSet({
range: set.difference(new is.GreaterThan(three), new is.GreaterThan(four))
}), "$gt:3 \\ $gt:4");
res = set.difference(
new MaybeDateStringSet({
range: new is.NotIn([undefined])
}),
new MaybeDateStringSet({
range: new is.LessThanEqual(three),
enum: new is.In([null])
})
);
assert.deepEqual(res, new MaybeDateStringSet({
range: new is.GreaterThan(three)
}), "{ne: undef} \\ {lt: 3} | null -> {gte: 3}");
res = set.difference(
new MaybeDateStringSet({
range: new is.NotIn([undefined])
}),
new MaybeDateStringSet({
range: new is.LessThanEqual(three)
})
);
assert.deepEqual(res, new MaybeDateStringSet({
range: new is.GreaterThan(three),
enum: new is.In([null])
}), "{ne: undef} \\ {lt: 3}|null -> {gte: 3} | null");
res = set.difference(set.UNIVERSAL,
new MaybeDateStringSet({
range: new is.In([null])
})
);
assert.deepEqual(res, new MaybeDateStringSet({
range: new is.NotIn([null])
}), "UNIVERSAL \\ null");
res = set.difference(set.UNIVERSAL,
new MaybeDateStringSet({
enum: new is.In([null, undefined]),
range: new is.LessThanEqual(three)
})
);
assert.deepEqual(res, gt3, "secondary and primary");
});
QUnit.test("intersection", function(assert) {
var res;
res = set.intersection(
new MaybeDateStringSet({
range: new is.GreaterThan(3),
enum: new is.In([null])
}),
new MaybeDateStringSet({
range: new is.GreaterThan(5),
enum: new is.In([null, undefined])
})
);
assert.deepEqual(res,
new MaybeDateStringSet({
range: new is.GreaterThan(5),
enum: new is.In([null])
}),
"got the right thing"
);
});
QUnit.test("union", function(assert) {
var res;
res = set.union(
new MaybeDateStringSet({
range: new is.GreaterThan(3),
enum: new is.In([null])
}),
new MaybeDateStringSet({
range: new is.GreaterThan(5),
enum: new is.In([undefined])
})
);
assert.deepEqual(res,
new MaybeDateStringSet({
range: new is.GreaterThan(3),
enum: new is.In([null, undefined])
}),
"got the right thing"
);
});
QUnit.test("isSubset", function(assert) {
var res;
res = set.isSubset(
new MaybeDateStringSet({
range: new is.In([3]),
enum: set.EMPTY
}),
new MaybeDateStringSet({
range: new is.In([3]),
enum: set.EMPTY
})
);
assert.ok(res, "is a subset");
});
QUnit.test("can make maybe type from normal type and makeMaybeSetType", function(assert) {
var MaybeNumber = canReflect.assignSymbols({}, {
"can.new": function(val) {
if (val == null) {
return val;
}
return +(val);
},
"can.getSchema": function() {
return {
type: "Or",
values: [Number, undefined, null]
};
}
});
assert.ok(makeMaybe.canMakeMaybeSetType(MaybeNumber), "got everything we need");
var types = makeMaybe.makeMaybeSetTypes(MaybeNumber);
var notUndefined = new types.Maybe({
range: new is.NotIn([new types.ComparisonSetType(undefined)])
}),
nullOrLTE3 = new types.Maybe({
range: new is.LessThanEqual(new types.ComparisonSetType(3)),
enum: new is.In([new types.ComparisonSetType(null)])
});
var res = set.difference(
notUndefined,
nullOrLTE3
);
assert.deepEqual(res, new types.Maybe({
range: new is.GreaterThan(new types.ComparisonSetType(3))
}), "{ne: undef} \\ {lt: 3} | null -> {gte: 3}");
});
QUnit.test("can make a maybe type from a ComparisonSetType", function(assert) {
function toDate(str) {
var type = typeof str;
if (type === 'string') {
str = Date.parse(str);
return isNaN(str) ? null : new Date(str);
} else if (type === 'number') {
return new Date(str);
} else {
return str;
}
}
function DateStringSet(dateStr) {
this.setValue = dateStr;
var date = toDate(dateStr);
this.value = date == null ? date : date.getTime();
}
DateStringSet.prototype.valueOf = function() {
return this.value;
};
canReflect.assignSymbols(DateStringSet.prototype, {
"can.serialize": function() {
return this.setValue;
}
});
var MaybeDate = canReflect.assignSymbols({}, {
"can.new": toDate,
"can.getSchema": function() {
return {
type: "Or",
values: [Date, undefined, null]
};
},
"can.ComparisonSetType": DateStringSet
});
assert.ok(makeMaybe.canMakeMaybeSetType(MaybeDate), "got everything we need");
var types = makeMaybe.makeMaybeSetTypes(MaybeDate);
assert.equal(types.ComparisonSetType, DateStringSet, "got the comparison type");
var date1982_10_20 = new Date(1982, 9, 20).toString();
var notUndefined = new types.Maybe({
range: new is.NotIn([new types.ComparisonSetType(undefined)])
}),
nullOrLTE3 = new types.Maybe({
range: new is.LessThanEqual(new types.ComparisonSetType(date1982_10_20)),
enum: new is.In([new types.ComparisonSetType(null)])
});
var res = set.difference(
notUndefined,
nullOrLTE3
);
assert.deepEqual(res, new types.Maybe({
range: new is.GreaterThan(new types.ComparisonSetType(date1982_10_20))
}), "{ne: undef} \\ {lt: '" + date1982_10_20 + "'} | null -> {gte: '" + date1982_10_20 + "'}");
});
QUnit.test("orValues", function(assert) {
var res = new MaybeDateStringSet({
range: new is.In([3]),
enum: set.EMPTY
});
assert.deepEqual(res.orValues(),[new is.In([3])] ,"only got range");
res = new MaybeDateStringSet({
range: set.EMPTY,
enum: new is.In([null])
});
assert.deepEqual(res.orValues(),[new is.In([null])] ,"only got enum");
});
/*
QUnit.test("intersection", function(){
var is0_5 = new DisjointOr([
new is.GreaterThan(0),
new is.LessThan(5)
]);
var is1_6 = new DisjointOr([
new is.GreaterThan(1),
new is.LessThan(6)
]);
var intersection = set.
});
QUnit.test("intersection", function(){
var is0_5 = new DisjointOr([
new is.GreaterThan(0),
new is.LessThan(5)
]);
var is1_6 = new DisjointOr([
new is.GreaterThan(1),
new is.LessThan(6)
]);
var intersection = set.
});
QUnit.test("difference", function(){
var greaterThan3 = new Maybe(new is.GreaterThan(3))
var res;
res = set.difference( set.UNIVERSAL, greaterThan3 );
assert.deepEqual(res,);
});
*/