quixote
Version:
CSS unit and integration testing
62 lines (47 loc) • 1.71 kB
JavaScript
// Copyright (c) 2014 Titanium I.T. LLC. All rights reserved. For license, see "README" or "LICENSE" file.
;
var ensure = require("../util/ensure.js");
var Size = require("../values/size.js");
var Descriptor = require("./descriptor.js");
var SizeDescriptor = require("./size_descriptor.js");
var Value = require("../values/value.js");
var SizeMultiple = require("./size_multiple.js");
var PLUS = 1;
var MINUS = -1;
var Me = module.exports = function RelativeSize(direction, relativeTo, amount) {
ensure.signature(arguments, [ Number, Descriptor, [Number, Descriptor, Value] ]);
this.should = this.createShould();
this._direction = direction;
this._relativeTo = relativeTo;
if (typeof amount === "number") {
this._amount = Size.create(Math.abs(amount));
if (amount < 0) this._direction *= -1;
}
else {
this._amount = amount;
}
};
SizeDescriptor.extend(Me);
Me.larger = factoryFn(PLUS);
Me.smaller = factoryFn(MINUS);
Me.prototype.value = function value() {
ensure.signature(arguments, []);
var baseValue = this._relativeTo.value();
var relativeValue = this._amount.value();
if (this._direction === PLUS) return baseValue.plus(relativeValue);
else return baseValue.minus(relativeValue);
};
Me.prototype.toString = function toString() {
ensure.signature(arguments, []);
var base = this._relativeTo.toString();
if (this._amount.equals(Size.create(0))) return base;
var relation = this._amount.toString();
if (this._direction === PLUS) relation += " larger than ";
else relation += " smaller than ";
return relation + base;
};
function factoryFn(direction) {
return function factory(relativeTo, amount) {
return new Me(direction, relativeTo, amount);
};
}