quixote
Version:
CSS unit and integration testing
71 lines (54 loc) • 2.22 kB
JavaScript
// Copyright (c) 2014 Titanium I.T. LLC. All rights reserved. For license, see "README" or "LICENSE" file.
"use strict";
var ensure = require("../util/ensure.js");
var Descriptor = require("./descriptor.js");
var PositionDescriptor = require("./position_descriptor.js");
var Value = require("../values/value.js");
var Size = require("../values/size.js");
var X_DIMENSION = "x";
var Y_DIMENSION = "y";
var PLUS = 1;
var MINUS = -1;
var Me = module.exports = function RelativePosition(dimension, direction, relativeTo, relativeAmount) {
ensure.signature(arguments, [ String, Number, Descriptor, [Number, Descriptor, Value] ]);
this.should = this.createShould();
if (dimension === X_DIMENSION) PositionDescriptor.x(this);
else if (dimension === Y_DIMENSION) PositionDescriptor.y(this);
else ensure.unreachable("Unknown dimension: " + dimension);
this._dimension = dimension;
this._direction = direction;
this._relativeTo = relativeTo;
if (typeof relativeAmount === "number") {
if (relativeAmount < 0) this._direction *= -1;
this._amount = Size.create(Math.abs(relativeAmount));
}
else {
this._amount = relativeAmount;
}
};
PositionDescriptor.extend(Me);
Me.right = createFn(X_DIMENSION, PLUS);
Me.down = createFn(Y_DIMENSION, PLUS);
Me.left = createFn(X_DIMENSION, MINUS);
Me.up = createFn(Y_DIMENSION, MINUS);
function createFn(dimension, direction) {
return function create(relativeTo, relativeAmount) {
return new Me(dimension, direction, relativeTo, relativeAmount);
};
}
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._dimension === X_DIMENSION) relation += (this._direction === PLUS) ? " to right of " : " to left of ";
else relation += (this._direction === PLUS) ? " below " : " above ";
return relation + base;
};