UNPKG

quixote

Version:

CSS unit and integration testing

71 lines (54 loc) 2.22 kB
// 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; };