-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #4 from LisiLisenok/develop
0.5.0
- Loading branch information
Showing
77 changed files
with
4,041 additions
and
2,455 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
145 changes: 72 additions & 73 deletions
145
examples/herd/examples/asynctest/fibonacci/fibonacci.ceylon
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,75 +1,74 @@ | ||
import ceylon.promise { | ||
import ceylon.promise { | ||
|
||
Deferred, | ||
Promise | ||
} | ||
import java.lang { | ||
Deferred, | ||
Promise | ||
} | ||
import java.lang { | ||
|
||
Runnable, | ||
Thread | ||
} | ||
|
||
"Calculates Fibonacci number by its index. | ||
" | ||
throws( `class AssertionError`, "passed index of Fibonacci number `indexOfFibonacciNumber` is less or equals to zero" ) | ||
shared Integer positiveFibonacciNumber( Integer indexOfFibonacciNumber ) { | ||
"Fibonnachi number index must be positive" | ||
assert ( indexOfFibonacciNumber > 0 ); | ||
variable Integer n0 = 0; | ||
variable Integer n1 = 1; | ||
variable Integer ret = 1; | ||
variable Integer currentIndex = 1; | ||
while ( currentIndex < indexOfFibonacciNumber ) { | ||
ret = n0 + n1; | ||
n0 = n1; | ||
n1 = ret; | ||
currentIndex ++; | ||
} | ||
return ret; | ||
} | ||
|
||
"Calculates index of positive Fibonacci number. That's may not be correct for index 1 and 2, | ||
which corresponds to equals Fibonacci numbers." | ||
throws( `class AssertionError`, "passed `fibonacciNumber` is not a Fibonacci number" ) | ||
shared Integer fibonacciNumberIndex( Integer fibonacciNumber ) { | ||
"fibonacci number must be positive" | ||
assert ( fibonacciNumber > 0 ); | ||
variable Integer n0 = 0; | ||
variable Integer n1 = 1; | ||
variable Integer ret = 1; | ||
variable Integer currentIndex = 1; | ||
while ( ret < fibonacciNumber ) { | ||
ret = n0 + n1; | ||
n0 = n1; | ||
n1 = ret; | ||
currentIndex ++; | ||
} | ||
"passed `fibonacciNumber` is not a Fibonacci number" | ||
assert ( ret == fibonacciNumber ); | ||
return currentIndex; | ||
} | ||
|
||
|
||
"Calculates Fibonacci number by its index in separated thread and returns result as promise. | ||
This is function to be tested." | ||
shared Promise<Integer> asyncPositiveFibonacciNumber( Integer indexOfFibonacciNumber ) { | ||
Deferred<Integer> ret = Deferred<Integer>(); | ||
|
||
Thread th = Thread ( | ||
object satisfies Runnable { | ||
shared actual void run() { | ||
try { | ||
ret.fulfill( positiveFibonacciNumber( indexOfFibonacciNumber ) ); | ||
} | ||
catch ( Throwable err ) { | ||
ret.reject( err ); | ||
} | ||
} | ||
} | ||
); | ||
th.start(); | ||
|
||
return ret.promise; | ||
} | ||
|
||
Runnable, | ||
Thread | ||
} | ||
|
||
"Calculates Fibonacci number by its index. | ||
Function returns incorrect result in order to demonstrate test framework output. | ||
" | ||
throws( `class AssertionError`, "passed index of Fibonacci number `indexOfFibonacciNumber` is less or equals to zero" ) | ||
shared Integer positiveFibonacciNumber( Integer indexOfFibonacciNumber ) { | ||
"Fibonnachi number index must be positive" | ||
assert ( indexOfFibonacciNumber > 0 ); | ||
variable Integer n0 = 0; | ||
variable Integer n1 = 1; | ||
variable Integer ret = 1; | ||
variable Integer currentIndex = 0; // use 1 to succeed the test! | ||
while ( currentIndex < indexOfFibonacciNumber ) { | ||
ret = n0 + n1; | ||
n0 = n1; | ||
n1 = ret; | ||
currentIndex ++; | ||
} | ||
return ret; | ||
} | ||
|
||
"Calculates index of positive Fibonacci number. That's may not be correct for index 1 and 2, | ||
which corresponds to equals Fibonacci numbers." | ||
throws( `class AssertionError`, "passed `fibonacciNumber` is not a Fibonacci number" ) | ||
shared Integer fibonacciNumberIndex( Integer fibonacciNumber ) { | ||
"fibonacci number must be positive" | ||
assert ( fibonacciNumber > 0 ); | ||
variable Integer n0 = 0; | ||
variable Integer n1 = 1; | ||
variable Integer ret = 1; | ||
variable Integer currentIndex = 1; | ||
while ( ret < fibonacciNumber ) { | ||
ret = n0 + n1; | ||
n0 = n1; | ||
n1 = ret; | ||
currentIndex ++; | ||
} | ||
"passed `fibonacciNumber` is not a Fibonacci number" | ||
assert ( ret == fibonacciNumber ); | ||
return currentIndex; | ||
} | ||
|
||
|
||
"Calculates Fibonacci number by its index in separated thread and returns result as promise. | ||
This is function to be tested." | ||
shared Promise<Integer> asyncPositiveFibonacciNumber( Integer indexOfFibonacciNumber ) { | ||
Deferred<Integer> ret = Deferred<Integer>(); | ||
|
||
Thread th = Thread ( | ||
object satisfies Runnable { | ||
shared actual void run() { | ||
try { | ||
ret.fulfill( positiveFibonacciNumber( indexOfFibonacciNumber ) ); | ||
} | ||
catch ( Throwable err ) { | ||
ret.reject( err ); | ||
} | ||
} | ||
} | ||
); | ||
th.start(); | ||
|
||
return ret.promise; | ||
} | ||
|
127 changes: 53 additions & 74 deletions
127
examples/herd/examples/asynctest/fibonacci/fibonacciTest.ceylon
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,76 +1,55 @@ | ||
import ceylon.test { | ||
import ceylon.test { | ||
|
||
parameters, | ||
test, | ||
testExecutor | ||
} | ||
import herd.asynctest { | ||
parameters, | ||
test, | ||
testExecutor | ||
} | ||
import herd.asynctest { | ||
|
||
AsyncTestContext, | ||
AsyncTestExecutor | ||
} | ||
|
||
|
||
"Fibonnachi test parameters." | ||
see( `function runFibonacciTest` ) | ||
{[Integer, Integer]*} fibonacciNumbers => | ||
{ | ||
[3, 2], [4, 3], [5, 5], [6, 8], [7, 13], [8, 21], [9, 34], [10, 55] | ||
}; | ||
|
||
|
||
"Runs test of Fibonacci numbers calculations. | ||
Testing: | ||
* comparison of expected value to calculated one | ||
* comparison of calculated index of Fibonacci number with passed one - this will fail if pass index `2` | ||
The function is marked with `testExecutor` annotation in order to perform asynchronous test. | ||
Alternatively `testExecutor` annotation can be used at module level." | ||
test parameters( `value fibonacciNumbers` ) | ||
testExecutor( `class AsyncTestExecutor` ) | ||
shared void runFibonacciTest ( | ||
"Context to send test results." AsyncTestContext context, | ||
"Index of fibonnachi number to be calculated." Integer indexOfFibonacciNumber, | ||
"Expected results of the calculations." Integer expectedFibonacciNumber | ||
) { | ||
// starts testing on context | ||
context.start(); | ||
|
||
// do testing procedure | ||
asyncPositiveFibonacciNumber( indexOfFibonacciNumber ).completed ( | ||
( Integer calculatedFibonacciNumber ) { | ||
// compare calculated and expected values and notify context if fails | ||
// Don't use `ceylon.test.assert...` here. It will throw on separated thread and will cause abnormal program termination | ||
context.assertTrue ( | ||
calculatedFibonacciNumber == expectedFibonacciNumber, | ||
"calculated Fibonacci number ``calculatedFibonacciNumber`` is not equal to expected one ``expectedFibonacciNumber``", | ||
"number equality" | ||
); | ||
|
||
// calculates index from resulting Fibonacci number and compare it with passed one | ||
try { | ||
value index = fibonacciNumberIndex( calculatedFibonacciNumber ); | ||
context.assertTrue ( | ||
index == indexOfFibonacciNumber, | ||
"calculated index of Fibonacci number ``index`` is not equal to expected one ``indexOfFibonacciNumber``", | ||
"index equality" | ||
); | ||
} | ||
catch ( Throwable err ) { | ||
context.fail( err ); | ||
} | ||
|
||
// completes the test when results reported | ||
context.complete( "Fibonacci number is ``calculatedFibonacciNumber``" ); | ||
}, | ||
( Throwable reason ) { | ||
// fail the test with error | ||
// Don't use `ceylon.test.fail` here. It will throw on separated thread and will cause abnormal program termination | ||
context.fail( reason ); | ||
// completes the test when fail reported | ||
context.complete(); | ||
} | ||
); | ||
|
||
// just return whithout completion - the test will be completed later when promise is resolved | ||
} | ||
AsyncTestContext, | ||
AsyncTestExecutor | ||
} | ||
import herd.asynctest.match { | ||
|
||
EqualTo, | ||
Mapping, | ||
MatchResult | ||
} | ||
|
||
|
||
"Fibonacci test parameters." | ||
see( `function runFibonacciTest` ) | ||
{[Integer, Integer]*} fibonacciNumbers => | ||
{ | ||
[3, 2], [4, 3], [5, 5], [6, 8], [7, 13], [8, 21], [9, 34], [10, 55] | ||
}; | ||
|
||
|
||
"Runs test of Fibonacci numbers calculations. | ||
Testing: | ||
* comparison of expected value to calculated one | ||
* comparison of calculated index of Fibonacci number with passed one - this will fail if pass index of `2` | ||
The function is marked with `testExecutor` annotation in order to perform asynchronous test. | ||
Alternatively `testExecutor` annotation can be used at module level." | ||
test parameters( `value fibonacciNumbers` ) | ||
testExecutor( `class AsyncTestExecutor` ) | ||
shared void runFibonacciTest ( | ||
"Context to send test results." AsyncTestContext context, | ||
"Index of Fibonacci number to be calculated." Integer indexOfFibonacciNumber, | ||
"Expected results of the calculations." Integer expectedFibonacciNumber | ||
) { | ||
// start testing on context | ||
context.start(); | ||
|
||
// perform calculation and checking | ||
context.assertThat<Integer> ( | ||
asyncPositiveFibonacciNumber( indexOfFibonacciNumber ), | ||
EqualTo( expectedFibonacciNumber ).and( Mapping( fibonacciNumberIndex, EqualTo( indexOfFibonacciNumber ) ) ), | ||
"", | ||
true | ||
).onComplete( ( MatchResult|Throwable res ) => context.complete() ); | ||
|
||
// just return whithout completion | ||
// the test will be completed later when promise returned by `asyncPositiveFibonacciNumber` is resolved | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,6 @@ | ||
" | ||
Testing of asynchronous calculation of Fibonacci numbers. | ||
Test is performed on [[asyncPositiveFibonacciNumber]] using [[runFibonacciTest]] test function. | ||
>Function [[positiveFibonacciNumber]] returns incorrect results in order to demonstrate test framework output. | ||
" | ||
by( "Lis" ) | ||
shared package herd.examples.asynctest.fibonacci; | ||
" | ||
Testing of asynchronous calculation of Fibonacci numbers. | ||
Test is performed on [[asyncPositiveFibonacciNumber]] using [[runFibonacciTest]] test function. | ||
" | ||
by( "Lis" ) | ||
shared package herd.examples.asynctest.fibonacci; |
Oops, something went wrong.