diff --git a/source/ceylon/time/Duration.ceylon b/source/ceylon/time/Duration.ceylon index aeb23f3f..f0cb5048 100644 --- a/source/ceylon/time/Duration.ceylon +++ b/source/ceylon/time/Duration.ceylon @@ -10,10 +10,20 @@ import ceylon.time.base { ReadableDuration } "Duration specifies a discreet amount of milliseconds between two instances of time." -shared serializable class Duration(milliseconds) satisfies ReadableDuration & Scalable { +shared serializable class Duration satisfies ReadableDuration + & Comparable + & Summable + & Scalable + & Invertible { + + shared static Duration zero = Duration(0); "Number of milliseconds of this duration." shared actual Integer milliseconds; + + shared new(Integer milliseconds) { + this.milliseconds = milliseconds; + } "Returns this duration as a period of milliseconds." shared Period period => Period { milliseconds = milliseconds; }; @@ -35,6 +45,14 @@ shared serializable class Duration(milliseconds) satisfies ReadableDuration & Sc value result = 3; return prime * result + milliseconds.hash; } + + shared actual Comparison compare(Duration other) => milliseconds.compare(other.milliseconds); + + shared actual Duration plus(Duration other) => Duration(milliseconds.plus(other.milliseconds)); + + shared actual Duration negated => Duration(milliseconds.negated); + + shared actual Duration minus(Duration other) => Duration(milliseconds.minus(other.milliseconds)); "Returns a new [[Duration]] with it´s milliseconds scaled." shared actual Duration scale(Integer scale) => Duration( scale * milliseconds ); diff --git a/test-source/test/ceylon/time/testDuration.ceylon b/test-source/test/ceylon/time/testDuration.ceylon index 378b7df3..2fbe7795 100644 --- a/test-source/test/ceylon/time/testDuration.ceylon +++ b/test-source/test/ceylon/time/testDuration.ceylon @@ -13,4 +13,25 @@ import ceylon.time { ]; parameters (`value scalableDurationTests`) shared test void testScalableDuration(Duration expectedDuration, Integer scale) - => assertEquals { expected = expectedDuration; actual = scale ** Duration(1000); }; + => assertEquals { actual = scale ** Duration(1000); expected = expectedDuration; }; + +shared test void testPlus() + => assertEquals { actual = Duration(-4567) + Duration(4567); expected= Duration.zero; }; + +shared test void testInv() + => assertEquals { actual = -Duration(99); expected= Duration(-99); }; + +shared test void testInvZero() + => assertEquals { actual = -Duration.zero; expected= Duration.zero; }; + +shared test void testMinus() + => assertEquals { actual = Duration(4567) - Duration(4567); expected= Duration.zero; }; + +shared test void testCompare() + => assertEquals { actual = Duration(345) <=> Duration(4567); expected= Comparison.smaller; }; + +shared test void testCompare() + => assertEquals { actual = Duration(3450) <=> Duration(456); expected= Comparison.greater; }; + +shared test void testCompare() + => assertEquals { actual = Duration(345) <=> Duration(345); expected= Comparison.equal; };