| Index: pkg/kernel/testcases/strong-mode/DeltaBlue.baseline.txt
|
| diff --git a/pkg/kernel/testcases/strong-mode/DeltaBlue.baseline.txt b/pkg/kernel/testcases/strong-mode/DeltaBlue.baseline.txt
|
| deleted file mode 100644
|
| index 2579576f2564dca7ffe6ddb5fa5407f147a6e32f..0000000000000000000000000000000000000000
|
| --- a/pkg/kernel/testcases/strong-mode/DeltaBlue.baseline.txt
|
| +++ /dev/null
|
| @@ -1,446 +0,0 @@
|
| -// dynamic is not a subtype of dart.core::int (DeltaBlue.dart:139:16)
|
| -library;
|
| -import self as self;
|
| -import "dart:core" as core;
|
| -
|
| -class DeltaBlue extends core::Object {
|
| - constructor •() → void
|
| - : super core::Object::•()
|
| - ;
|
| - method run() → void {
|
| - self::chainTest(100);
|
| - self::projectionTest(100);
|
| - }
|
| -}
|
| -class Strength extends core::Object {
|
| - final field core::int value;
|
| - final field core::String name;
|
| - const constructor •(core::int value, core::String name) → void
|
| - : self::Strength::value = value, self::Strength::name = name, super core::Object::•()
|
| - ;
|
| - method nextWeaker() → self::Strength
|
| - return const <self::Strength>[self::STRONG_PREFERRED, self::PREFERRED, self::STRONG_DEFAULT, self::NORMAL, self::WEAK_DEFAULT, self::WEAKEST].{core::List::[]}(this.{self::Strength::value});
|
| - static method stronger(self::Strength s1, self::Strength s2) → core::bool {
|
| - return s1.{self::Strength::value}.{core::num::<}(s2.{self::Strength::value});
|
| - }
|
| - static method weaker(self::Strength s1, self::Strength s2) → core::bool {
|
| - return s1.{self::Strength::value}.{core::num::>}(s2.{self::Strength::value});
|
| - }
|
| - static method weakest(self::Strength s1, self::Strength s2) → self::Strength {
|
| - return self::Strength::weaker(s1, s2) ? s1 : s2;
|
| - }
|
| -}
|
| -abstract class Constraint extends core::Object {
|
| - final field self::Strength strength;
|
| - const constructor •(self::Strength strength) → void
|
| - : self::Constraint::strength = strength, super core::Object::•()
|
| - ;
|
| - abstract method isSatisfied() → core::bool;
|
| - abstract method markUnsatisfied() → void;
|
| - abstract method addToGraph() → void;
|
| - abstract method removeFromGraph() → void;
|
| - abstract method chooseMethod(core::int mark) → void;
|
| - abstract method markInputs(core::int mark) → void;
|
| - abstract method inputsKnown(core::int mark) → core::bool;
|
| - abstract method output() → self::Variable;
|
| - abstract method execute() → void;
|
| - abstract method recalculate() → void;
|
| - method addConstraint() → void {
|
| - this.{self::Constraint::addToGraph}();
|
| - self::planner.{self::Planner::incrementalAdd}(this);
|
| - }
|
| - method satisfy(dynamic mark) → self::Constraint {
|
| - this.{self::Constraint::chooseMethod}(mark as core::int);
|
| - if(!this.{self::Constraint::isSatisfied}()) {
|
| - if(this.{self::Constraint::strength}.{core::Object::==}(self::REQUIRED)) {
|
| - core::print("Could not satisfy a required constraint!");
|
| - }
|
| - return null;
|
| - }
|
| - this.{self::Constraint::markInputs}(mark as core::int);
|
| - self::Variable out = this.{self::Constraint::output}();
|
| - self::Constraint overridden = out.{self::Variable::determinedBy};
|
| - if(!overridden.{core::Object::==}(null))
|
| - overridden.{self::Constraint::markUnsatisfied}();
|
| - out.{self::Variable::determinedBy} = this;
|
| - if(!self::planner.{self::Planner::addPropagate}(this, mark as core::int))
|
| - core::print("Cycle encountered");
|
| - out.{self::Variable::mark} = mark;
|
| - return overridden;
|
| - }
|
| - method destroyConstraint() → void {
|
| - if(this.{self::Constraint::isSatisfied}())
|
| - self::planner.{self::Planner::incrementalRemove}(this);
|
| - this.{self::Constraint::removeFromGraph}();
|
| - }
|
| - method isInput() → core::bool
|
| - return false;
|
| -}
|
| -abstract class UnaryConstraint extends self::Constraint {
|
| - final field self::Variable myOutput;
|
| - field core::bool satisfied = false;
|
| - constructor •(self::Variable myOutput, self::Strength strength) → void
|
| - : self::UnaryConstraint::myOutput = myOutput, super self::Constraint::•(strength) {
|
| - this.{self::Constraint::addConstraint}();
|
| - }
|
| - method addToGraph() → void {
|
| - this.{self::UnaryConstraint::myOutput}.{self::Variable::addConstraint}(this);
|
| - this.{self::UnaryConstraint::satisfied} = false;
|
| - }
|
| - method chooseMethod(core::int mark) → void {
|
| - this.{self::UnaryConstraint::satisfied} = !this.{self::UnaryConstraint::myOutput}.{self::Variable::mark}.{core::num::==}(mark) && self::Strength::stronger(this.{self::Constraint::strength}, this.{self::UnaryConstraint::myOutput}.{self::Variable::walkStrength});
|
| - }
|
| - method isSatisfied() → core::bool
|
| - return this.{self::UnaryConstraint::satisfied};
|
| - method markInputs(core::int mark) → void {}
|
| - method output() → self::Variable
|
| - return this.{self::UnaryConstraint::myOutput};
|
| - method recalculate() → void {
|
| - this.{self::UnaryConstraint::myOutput}.{self::Variable::walkStrength} = this.{self::Constraint::strength};
|
| - this.{self::UnaryConstraint::myOutput}.{self::Variable::stay} = !this.{self::Constraint::isInput}();
|
| - if(this.{self::UnaryConstraint::myOutput}.{self::Variable::stay})
|
| - this.{self::Constraint::execute}();
|
| - }
|
| - method markUnsatisfied() → void {
|
| - this.{self::UnaryConstraint::satisfied} = false;
|
| - }
|
| - method inputsKnown(core::int mark) → core::bool
|
| - return true;
|
| - method removeFromGraph() → void {
|
| - if(!this.{self::UnaryConstraint::myOutput}.{core::Object::==}(null))
|
| - this.{self::UnaryConstraint::myOutput}.{self::Variable::removeConstraint}(this);
|
| - this.{self::UnaryConstraint::satisfied} = false;
|
| - }
|
| -}
|
| -class StayConstraint extends self::UnaryConstraint {
|
| - constructor •(self::Variable v, self::Strength str) → void
|
| - : super self::UnaryConstraint::•(v, str)
|
| - ;
|
| - method execute() → void {}
|
| -}
|
| -class EditConstraint extends self::UnaryConstraint {
|
| - constructor •(self::Variable v, self::Strength str) → void
|
| - : super self::UnaryConstraint::•(v, str)
|
| - ;
|
| - method isInput() → core::bool
|
| - return true;
|
| - method execute() → void {}
|
| -}
|
| -abstract class BinaryConstraint extends self::Constraint {
|
| - field self::Variable v1;
|
| - field self::Variable v2;
|
| - field core::int direction = self::NONE;
|
| - constructor •(self::Variable v1, self::Variable v2, self::Strength strength) → void
|
| - : self::BinaryConstraint::v1 = v1, self::BinaryConstraint::v2 = v2, super self::Constraint::•(strength) {
|
| - this.{self::Constraint::addConstraint}();
|
| - }
|
| - method chooseMethod(core::int mark) → void {
|
| - if(this.{self::BinaryConstraint::v1}.{self::Variable::mark}.{core::num::==}(mark)) {
|
| - this.{self::BinaryConstraint::direction} = !this.{self::BinaryConstraint::v2}.{self::Variable::mark}.{core::num::==}(mark) && self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v2}.{self::Variable::walkStrength}) ? self::FORWARD : self::NONE;
|
| - }
|
| - if(this.{self::BinaryConstraint::v2}.{self::Variable::mark}.{core::num::==}(mark)) {
|
| - this.{self::BinaryConstraint::direction} = !this.{self::BinaryConstraint::v1}.{self::Variable::mark}.{core::num::==}(mark) && self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v1}.{self::Variable::walkStrength}) ? self::BACKWARD : self::NONE;
|
| - }
|
| - if(self::Strength::weaker(this.{self::BinaryConstraint::v1}.{self::Variable::walkStrength}, this.{self::BinaryConstraint::v2}.{self::Variable::walkStrength})) {
|
| - this.{self::BinaryConstraint::direction} = self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v1}.{self::Variable::walkStrength}) ? self::BACKWARD : self::NONE;
|
| - }
|
| - else {
|
| - this.{self::BinaryConstraint::direction} = self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v2}.{self::Variable::walkStrength}) ? self::FORWARD : self::BACKWARD;
|
| - }
|
| - }
|
| - method addToGraph() → void {
|
| - this.{self::BinaryConstraint::v1}.{self::Variable::addConstraint}(this);
|
| - this.{self::BinaryConstraint::v2}.{self::Variable::addConstraint}(this);
|
| - this.{self::BinaryConstraint::direction} = self::NONE;
|
| - }
|
| - method isSatisfied() → core::bool
|
| - return !this.{self::BinaryConstraint::direction}.{core::num::==}(self::NONE);
|
| - method markInputs(core::int mark) → void {
|
| - this.{self::BinaryConstraint::input}().{self::Variable::mark} = mark;
|
| - }
|
| - method input() → self::Variable
|
| - return this.{self::BinaryConstraint::direction}.{core::num::==}(self::FORWARD) ? this.{self::BinaryConstraint::v1} : this.{self::BinaryConstraint::v2};
|
| - method output() → self::Variable
|
| - return this.{self::BinaryConstraint::direction}.{core::num::==}(self::FORWARD) ? this.{self::BinaryConstraint::v2} : this.{self::BinaryConstraint::v1};
|
| - method recalculate() → void {
|
| - self::Variable ihn = this.{self::BinaryConstraint::input}();
|
| - self::Variable out = this.{self::BinaryConstraint::output}();
|
| - out.{self::Variable::walkStrength} = self::Strength::weakest(this.{self::Constraint::strength}, ihn.{self::Variable::walkStrength});
|
| - out.{self::Variable::stay} = ihn.{self::Variable::stay};
|
| - if(out.{self::Variable::stay})
|
| - this.{self::Constraint::execute}();
|
| - }
|
| - method markUnsatisfied() → void {
|
| - this.{self::BinaryConstraint::direction} = self::NONE;
|
| - }
|
| - method inputsKnown(core::int mark) → core::bool {
|
| - self::Variable i = this.{self::BinaryConstraint::input}();
|
| - return i.{self::Variable::mark}.{core::num::==}(mark) || i.{self::Variable::stay} || i.{self::Variable::determinedBy}.{core::Object::==}(null);
|
| - }
|
| - method removeFromGraph() → void {
|
| - if(!this.{self::BinaryConstraint::v1}.{core::Object::==}(null))
|
| - this.{self::BinaryConstraint::v1}.{self::Variable::removeConstraint}(this);
|
| - if(!this.{self::BinaryConstraint::v2}.{core::Object::==}(null))
|
| - this.{self::BinaryConstraint::v2}.{self::Variable::removeConstraint}(this);
|
| - this.{self::BinaryConstraint::direction} = self::NONE;
|
| - }
|
| -}
|
| -class ScaleConstraint extends self::BinaryConstraint {
|
| - final field self::Variable scale;
|
| - final field self::Variable offset;
|
| - constructor •(self::Variable src, self::Variable scale, self::Variable offset, self::Variable dest, self::Strength strength) → void
|
| - : self::ScaleConstraint::scale = scale, self::ScaleConstraint::offset = offset, super self::BinaryConstraint::•(src, dest, strength)
|
| - ;
|
| - method addToGraph() → void {
|
| - this.{=self::BinaryConstraint::addToGraph}();
|
| - this.{self::ScaleConstraint::scale}.{self::Variable::addConstraint}(this);
|
| - this.{self::ScaleConstraint::offset}.{self::Variable::addConstraint}(this);
|
| - }
|
| - method removeFromGraph() → void {
|
| - this.{=self::BinaryConstraint::removeFromGraph}();
|
| - if(!this.{self::ScaleConstraint::scale}.{core::Object::==}(null))
|
| - this.{self::ScaleConstraint::scale}.{self::Variable::removeConstraint}(this);
|
| - if(!this.{self::ScaleConstraint::offset}.{core::Object::==}(null))
|
| - this.{self::ScaleConstraint::offset}.{self::Variable::removeConstraint}(this);
|
| - }
|
| - method markInputs(core::int mark) → void {
|
| - this.{=self::BinaryConstraint::markInputs}(mark);
|
| - this.{self::ScaleConstraint::scale}.{self::Variable::mark} = this.{self::ScaleConstraint::offset}.{self::Variable::mark} = mark;
|
| - }
|
| - method execute() → void {
|
| - if(this.{self::BinaryConstraint::direction}.{core::num::==}(self::FORWARD)) {
|
| - this.{self::BinaryConstraint::v2}.{self::Variable::value} = this.{self::BinaryConstraint::v1}.{self::Variable::value}.{core::num::*}(this.{self::ScaleConstraint::scale}.{self::Variable::value}).{core::num::+}(this.{self::ScaleConstraint::offset}.{self::Variable::value});
|
| - }
|
| - else {
|
| - this.{self::BinaryConstraint::v1}.{self::Variable::value} = this.{self::BinaryConstraint::v2}.{self::Variable::value}.{core::num::-}(this.{self::ScaleConstraint::offset}.{self::Variable::value}).{core::num::~/}(this.{self::ScaleConstraint::scale}.{self::Variable::value});
|
| - }
|
| - }
|
| - method recalculate() → void {
|
| - self::Variable ihn = this.{self::BinaryConstraint::input}();
|
| - self::Variable out = this.{self::BinaryConstraint::output}();
|
| - out.{self::Variable::walkStrength} = self::Strength::weakest(this.{self::Constraint::strength}, ihn.{self::Variable::walkStrength});
|
| - out.{self::Variable::stay} = ihn.{self::Variable::stay} && this.{self::ScaleConstraint::scale}.{self::Variable::stay} && this.{self::ScaleConstraint::offset}.{self::Variable::stay};
|
| - if(out.{self::Variable::stay})
|
| - this.{self::ScaleConstraint::execute}();
|
| - }
|
| -}
|
| -class EqualityConstraint extends self::BinaryConstraint {
|
| - constructor •(self::Variable v1, self::Variable v2, self::Strength strength) → void
|
| - : super self::BinaryConstraint::•(v1, v2, strength)
|
| - ;
|
| - method execute() → void {
|
| - this.{self::BinaryConstraint::output}().{self::Variable::value} = this.{self::BinaryConstraint::input}().{self::Variable::value};
|
| - }
|
| -}
|
| -class Variable extends core::Object {
|
| - field core::List<self::Constraint> constraints = <self::Constraint>[];
|
| - field self::Constraint determinedBy = null;
|
| - field core::int mark = 0;
|
| - field self::Strength walkStrength = self::WEAKEST;
|
| - field core::bool stay = true;
|
| - field core::int value;
|
| - final field core::String name;
|
| - constructor •(core::String name, core::int value) → void
|
| - : self::Variable::name = name, self::Variable::value = value, super core::Object::•()
|
| - ;
|
| - method addConstraint(self::Constraint c) → void {
|
| - this.{self::Variable::constraints}.{core::List::add$cc}(c);
|
| - }
|
| - method removeConstraint(self::Constraint c) → void {
|
| - this.{self::Variable::constraints}.{core::List::remove}(c);
|
| - if(this.{self::Variable::determinedBy}.{core::Object::==}(c))
|
| - this.{self::Variable::determinedBy} = null;
|
| - }
|
| -}
|
| -class Planner extends core::Object {
|
| - field core::int currentMark = 0;
|
| - constructor •() → void
|
| - : super core::Object::•()
|
| - ;
|
| - method incrementalAdd(self::Constraint c) → void {
|
| - core::int mark = this.{self::Planner::newMark}();
|
| - for (self::Constraint overridden = c.{self::Constraint::satisfy}(mark); !overridden.{core::Object::==}(null); overridden = overridden.{self::Constraint::satisfy}(mark))
|
| - ;
|
| - }
|
| - method incrementalRemove(self::Constraint c) → void {
|
| - self::Variable out = c.{self::Constraint::output}();
|
| - c.{self::Constraint::markUnsatisfied}();
|
| - c.{self::Constraint::removeFromGraph}();
|
| - core::List<self::Constraint> unsatisfied = this.{self::Planner::removePropagateFrom}(out);
|
| - self::Strength strength = self::REQUIRED;
|
| - do {
|
| - for (core::int i = 0; i.{core::num::<}(unsatisfied.{core::List::length}); i = i.{core::num::+}(1)) {
|
| - self::Constraint u = unsatisfied.{core::List::[]}(i);
|
| - if(u.{self::Constraint::strength}.{core::Object::==}(strength))
|
| - this.{self::Planner::incrementalAdd}(u);
|
| - }
|
| - strength = strength.{self::Strength::nextWeaker}();
|
| - }
|
| - while (!strength.{core::Object::==}(self::WEAKEST))
|
| - }
|
| - method newMark() → core::int
|
| - return this.{self::Planner::currentMark} = this.{self::Planner::currentMark}.{core::num::+}(1);
|
| - method makePlan(core::List<self::Constraint> sources) → self::Plan {
|
| - core::int mark = this.{self::Planner::newMark}();
|
| - self::Plan plan = new self::Plan::•();
|
| - core::List<self::Constraint> todo = sources;
|
| - while (todo.{core::List::length}.{core::num::>}(0)) {
|
| - self::Constraint c = todo.{core::List::removeLast}();
|
| - if(!c.{self::Constraint::output}().{self::Variable::mark}.{core::num::==}(mark) && c.{self::Constraint::inputsKnown}(mark)) {
|
| - plan.{self::Plan::addConstraint}(c);
|
| - c.{self::Constraint::output}().{self::Variable::mark} = mark;
|
| - this.{self::Planner::addConstraintsConsumingTo}(c.{self::Constraint::output}(), todo);
|
| - }
|
| - }
|
| - return plan;
|
| - }
|
| - method extractPlanFromConstraints(core::List<self::Constraint> constraints) → self::Plan {
|
| - core::List<self::Constraint> sources = <self::Constraint>[];
|
| - for (core::int i = 0; i.{core::num::<}(constraints.{core::List::length}); i = i.{core::num::+}(1)) {
|
| - self::Constraint c = constraints.{core::List::[]}(i);
|
| - if(c.{self::Constraint::isInput}() && c.{self::Constraint::isSatisfied}())
|
| - sources.{core::List::add$cc}(c);
|
| - }
|
| - return this.{self::Planner::makePlan}(sources);
|
| - }
|
| - method addPropagate(self::Constraint c, core::int mark) → core::bool {
|
| - core::List<self::Constraint> todo = <self::Constraint>[c];
|
| - while (todo.{core::List::length}.{core::num::>}(0)) {
|
| - self::Constraint d = todo.{core::List::removeLast}();
|
| - if(d.{self::Constraint::output}().{self::Variable::mark}.{core::num::==}(mark)) {
|
| - this.{self::Planner::incrementalRemove}(c);
|
| - return false;
|
| - }
|
| - d.{self::Constraint::recalculate}();
|
| - this.{self::Planner::addConstraintsConsumingTo}(d.{self::Constraint::output}(), todo);
|
| - }
|
| - return true;
|
| - }
|
| - method removePropagateFrom(self::Variable out) → core::List<self::Constraint> {
|
| - out.{self::Variable::determinedBy} = null;
|
| - out.{self::Variable::walkStrength} = self::WEAKEST;
|
| - out.{self::Variable::stay} = true;
|
| - core::List<self::Constraint> unsatisfied = <self::Constraint>[];
|
| - core::List<self::Variable> todo = <self::Variable>[out];
|
| - while (todo.{core::List::length}.{core::num::>}(0)) {
|
| - self::Variable v = todo.{core::List::removeLast}();
|
| - for (core::int i = 0; i.{core::num::<}(v.{self::Variable::constraints}.{core::List::length}); i = i.{core::num::+}(1)) {
|
| - self::Constraint c = v.{self::Variable::constraints}.{core::List::[]}(i);
|
| - if(!c.{self::Constraint::isSatisfied}())
|
| - unsatisfied.{core::List::add$cc}(c);
|
| - }
|
| - self::Constraint determining = v.{self::Variable::determinedBy};
|
| - for (core::int i = 0; i.{core::num::<}(v.{self::Variable::constraints}.{core::List::length}); i = i.{core::num::+}(1)) {
|
| - self::Constraint next = v.{self::Variable::constraints}.{core::List::[]}(i);
|
| - if(!next.{core::Object::==}(determining) && next.{self::Constraint::isSatisfied}()) {
|
| - next.{self::Constraint::recalculate}();
|
| - todo.{core::List::add}(next.{self::Constraint::output}());
|
| - }
|
| - }
|
| - }
|
| - return unsatisfied;
|
| - }
|
| - method addConstraintsConsumingTo(self::Variable v, core::List<self::Constraint> coll) → void {
|
| - self::Constraint determining = v.{self::Variable::determinedBy};
|
| - for (core::int i = 0; i.{core::num::<}(v.{self::Variable::constraints}.{core::List::length}); i = i.{core::num::+}(1)) {
|
| - self::Constraint c = v.{self::Variable::constraints}.{core::List::[]}(i);
|
| - if(!c.{core::Object::==}(determining) && c.{self::Constraint::isSatisfied}())
|
| - coll.{core::List::add$cc}(c);
|
| - }
|
| - }
|
| -}
|
| -class Plan extends core::Object {
|
| - field core::List<self::Constraint> list = <self::Constraint>[];
|
| - constructor •() → void
|
| - : super core::Object::•()
|
| - ;
|
| - method addConstraint(self::Constraint c) → void {
|
| - this.{self::Plan::list}.{core::List::add$cc}(c);
|
| - }
|
| - method execute() → void {
|
| - for (core::int i = 0; i.{core::num::<}(this.{self::Plan::list}.{core::List::length}); i = i.{core::num::+}(1)) {
|
| - this.{self::Plan::list}.{core::List::[]}(i).{self::Constraint::execute}();
|
| - }
|
| - }
|
| -}
|
| -static const field self::Strength REQUIRED = const self::Strength::•(0, "required");
|
| -static const field self::Strength STRONG_PREFERRED = const self::Strength::•(1, "strongPreferred");
|
| -static const field self::Strength PREFERRED = const self::Strength::•(2, "preferred");
|
| -static const field self::Strength STRONG_DEFAULT = const self::Strength::•(3, "strongDefault");
|
| -static const field self::Strength NORMAL = const self::Strength::•(4, "normal");
|
| -static const field self::Strength WEAK_DEFAULT = const self::Strength::•(5, "weakDefault");
|
| -static const field self::Strength WEAKEST = const self::Strength::•(6, "weakest");
|
| -static const field core::int NONE = 1;
|
| -static const field core::int FORWARD = 2;
|
| -static const field core::int BACKWARD = 0;
|
| -static field self::Planner planner = null;
|
| -static method main() → dynamic {
|
| - new self::DeltaBlue::•().{self::DeltaBlue::run}();
|
| -}
|
| -static method chainTest(core::int n) → void {
|
| - self::planner = new self::Planner::•();
|
| - self::Variable prev = null;
|
| - self::Variable first = null;
|
| - self::Variable last = null;
|
| - for (core::int i = 0; i.{core::num::<=}(n); i = i.{core::num::+}(1)) {
|
| - self::Variable v = new self::Variable::•("v${i}", 0);
|
| - if(!prev.{core::Object::==}(null))
|
| - new self::EqualityConstraint::•(prev, v, self::REQUIRED);
|
| - if(i.{core::num::==}(0))
|
| - first = v;
|
| - if(i.{core::num::==}(n))
|
| - last = v;
|
| - prev = v;
|
| - }
|
| - new self::StayConstraint::•(last, self::STRONG_DEFAULT);
|
| - self::EditConstraint edit = new self::EditConstraint::•(first, self::PREFERRED);
|
| - self::Plan plan = self::planner.{self::Planner::extractPlanFromConstraints}(<self::Constraint>[edit]);
|
| - for (core::int i = 0; i.{core::num::<}(100); i = i.{core::num::+}(1)) {
|
| - first.{self::Variable::value} = i;
|
| - plan.{self::Plan::execute}();
|
| - if(!last.{self::Variable::value}.{core::num::==}(i)) {
|
| - core::print("Chain test failed:");
|
| - core::print("Expected last value to be ${i} but it was ${last.{self::Variable::value}}.");
|
| - }
|
| - }
|
| -}
|
| -static method projectionTest(core::int n) → void {
|
| - self::planner = new self::Planner::•();
|
| - self::Variable scale = new self::Variable::•("scale", 10);
|
| - self::Variable offset = new self::Variable::•("offset", 1000);
|
| - self::Variable src = null;
|
| - self::Variable dst = null;
|
| - core::List<self::Variable> dests = <self::Variable>[];
|
| - for (core::int i = 0; i.{core::num::<}(n); i = i.{core::num::+}(1)) {
|
| - src = new self::Variable::•("src", i);
|
| - dst = new self::Variable::•("dst", i);
|
| - dests.{core::List::add}(dst);
|
| - new self::StayConstraint::•(src, self::NORMAL);
|
| - new self::ScaleConstraint::•(src, scale, offset, dst, self::REQUIRED);
|
| - }
|
| - self::change(src, 17);
|
| - if(!dst.{self::Variable::value}.{core::num::==}(1170))
|
| - core::print("Projection 1 failed");
|
| - self::change(dst, 1050);
|
| - if(!src.{self::Variable::value}.{core::num::==}(5))
|
| - core::print("Projection 2 failed");
|
| - self::change(scale, 5);
|
| - for (core::int i = 0; i.{core::num::<}(n.{core::num::-}(1)); i = i.{core::num::+}(1)) {
|
| - if(!dests.{core::List::[]}(i).{self::Variable::value}.{core::num::==}(i.{core::num::*}(5).{core::num::+}(1000)))
|
| - core::print("Projection 3 failed");
|
| - }
|
| - self::change(offset, 2000);
|
| - for (core::int i = 0; i.{core::num::<}(n.{core::num::-}(1)); i = i.{core::num::+}(1)) {
|
| - if(!dests.{core::List::[]}(i).{self::Variable::value}.{core::num::==}(i.{core::num::*}(5).{core::num::+}(2000)))
|
| - core::print("Projection 4 failed");
|
| - }
|
| -}
|
| -static method change(self::Variable v, core::int newValue) → void {
|
| - self::EditConstraint edit = new self::EditConstraint::•(v, self::PREFERRED);
|
| - self::Plan plan = self::planner.{self::Planner::extractPlanFromConstraints}(<self::EditConstraint>[edit]);
|
| - for (core::int i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1)) {
|
| - v.{self::Variable::value} = newValue;
|
| - plan.{self::Plan::execute}();
|
| - }
|
| - edit.{self::Constraint::destroyConstraint}();
|
| -}
|
|
|