Skip to content

Commit

Permalink
Added Optional
Browse files Browse the repository at this point in the history
  • Loading branch information
gcotelli committed Mar 16, 2017
1 parent a111af2 commit 7db0354
Show file tree
Hide file tree
Showing 51 changed files with 463 additions and 2 deletions.
@@ -0,0 +1 @@
An OptionalTest is a test class for testing the behavior of Optional
@@ -0,0 +1,8 @@
tests-Combining
testForEveryInjectIntoWhenEmpty

| combinedOptional |

combinedOptional := Optional forEvery: #() injectInto: [ :min :current | self fail ].

self assert: (combinedOptional withContentDo: [ :x | self fail ] ifUnused: [ 0 ]) isZero
@@ -0,0 +1,17 @@
tests-Combining
testForEveryInjectIntoWhenFirstUnused

| firstOptional secondOptional thirdOptional combinedOptional |

firstOptional := Optional unused.
secondOptional := Optional containing: 1.
thirdOptional := Optional containing: 3.

combinedOptional := Optional
forEvery:
{firstOptional.
secondOptional.
thirdOptional}
injectInto: [ :min :current | min min: current ].

self assert: (combinedOptional withContentDo: [ :min | self fail ] ifUnused: [ 0 ]) isZero
@@ -0,0 +1,17 @@
tests-Combining
testForEveryInjectIntoWhenSomeUnused

| firstOptional secondOptional thirdOptional combinedOptional |

firstOptional := Optional containing: 1.
secondOptional := Optional unused.
thirdOptional := Optional containing: 3.

combinedOptional := Optional
forEvery:
{firstOptional.
secondOptional.
thirdOptional}
injectInto: [ :min :current | min min: current ].

self assert: (combinedOptional withContentDo: [ :min | self fail ] ifUnused: [ 0 ]) isZero
@@ -0,0 +1,26 @@
tests-Combining
testForEveryUsedOptionalInjectInto

| firstOptional secondOptional thirdOptional combinedOptional |

firstOptional := Optional containing: 1.
secondOptional := Optional containing: 0.
thirdOptional := Optional containing: 3.

combinedOptional := Optional
forEvery:
{firstOptional.
secondOptional.
thirdOptional}
injectInto: [ :min :current | min min: current ].

combinedOptional withContentDo: [ :min | self assert: min equals: 0 ] ifUnused: [ self fail ].

combinedOptional := Optional
forEvery:
{firstOptional.
secondOptional.
thirdOptional}
injectInto: [ :sum :current | sum + current ].

combinedOptional withContentDo: [ :sum | self assert: sum equals: 4 ] ifUnused: [ self fail ]
@@ -0,0 +1,25 @@
tests-Combining
testWithAllReturn

| firstOptional secondOptional thirdOptional combinedOptional |

firstOptional := Optional containing: 0.
secondOptional := Optional containing: 2.
thirdOptional := Optional containing: 3.

combinedOptional := firstOptional
withAll:
{secondOptional.
thirdOptional}
return: [ :addends | addends sum ].

combinedOptional withContentDo: [ :sum | self assert: sum equals: 5 ] ifUnused: [ self fail ].

combinedOptional := Optional
withAll:
{firstOptional.
secondOptional.
thirdOptional}
return: [ :addends | addends sum ].

combinedOptional withContentDo: [ :sum | self assert: sum equals: 5 ] ifUnused: [ self fail ]
@@ -0,0 +1,8 @@
tests-Combining
testWithAllReturnWhenEmpty

| combinedOptional |

combinedOptional := Optional withAll: #() return: [ :addends | addends sum ].

combinedOptional withContentDo: [ :sum | self fail ] ifUnused: [ :explanations | self assert: explanations isEmpty ]
@@ -0,0 +1,25 @@
tests-Combining
testWithAllReturnWhenFirstIsUnused

| firstOptional secondOptional thirdOptional combinedOptional |

firstOptional := Optional unusedBecause: 'This is expected.'.
secondOptional := Optional unusedBecause: 'This is also expected.'.
thirdOptional := Optional containing: 3.

combinedOptional := firstOptional
withAll:
{secondOptional.
thirdOptional}
return: [ :addends | addends sum ].

combinedOptional withContentDo: [ :sum | self fail ] ifUnused: [ :explanations | self assert: explanations equals: #('This is expected.' 'This is also expected.') ].

combinedOptional := Optional
withAll:
{firstOptional.
secondOptional.
thirdOptional}
return: [ :addends | addends sum ].

combinedOptional withContentDo: [ :sum | self fail ] ifUnused: [ :explanations | self assert: explanations equals: #('This is expected.' 'This is also expected.') ]
@@ -0,0 +1,25 @@
tests-Combining
testWithAllReturnWhenSomeAreUnused

| firstOptional secondOptional thirdOptional combinedOptional |

firstOptional := Optional containing: 0.
secondOptional := Optional unused.
thirdOptional := Optional containing: 3.

combinedOptional := firstOptional
withAll:
{secondOptional.
thirdOptional}
return: [ :addends | addends sum ].

combinedOptional withContentDo: [ :sum | self fail ] ifUnused: [ :explanations | self assert: explanations isEmpty ].

combinedOptional := Optional
withAll:
{firstOptional.
secondOptional.
thirdOptional}
return: [ :addends | addends sum ].

combinedOptional withContentDo: [ :sum | self fail ] ifUnused: [ :explanations | self assert: explanations isEmpty ]
@@ -0,0 +1,13 @@
tests-Accessing
testWithContentDo

| optional expectedContent content |

expectedContent := 2.
content := 1.

optional := Optional containing: expectedContent.

optional withContentDo: [ :theContent | content := theContent ].

self assert: content equals: expectedContent
@@ -0,0 +1,12 @@
tests-Accessing
testWithContentDoIfUnused

| optional expectedContent content |

expectedContent := 2.

optional := Optional containing: expectedContent.

content := optional withContentDo: [ :theContent | theContent ] ifUnused: [ self fail ].

self assert: content equals: expectedContent
@@ -0,0 +1,16 @@
tests-Accessing
testWithContentDoIfUnusedWhenUnused

| optional defaultContent content expectedExplanation |

defaultContent := 2.
expectedExplanation := 'The identifier is not configured.'.
optional := Optional unusedBecause: expectedExplanation.

content := optional
withContentDo: [ :theContent | self fail ]
ifUnused: [ :explanations |
self assertCollection: explanations hasSameElements: {expectedExplanation}.
defaultContent ].

self assert: content equals: defaultContent
@@ -0,0 +1,10 @@
tests-Accessing
testWithContentDoWhenUnused

| optional expectedExplanation |

expectedExplanation := 'The identifier is unassigned'.

optional := Optional unusedBecause: expectedExplanation.

optional withContentDo: [ :theContent | self fail ]
@@ -0,0 +1,11 @@
tests-Combining
testWithReturn

| firstOptional secondOptional combinedOptional |

firstOptional := Optional containing: 1.
secondOptional := Optional containing: 2.

combinedOptional := firstOptional with: secondOptional return: [ :x :y | x + y ].

combinedOptional withContentDo: [ :sum | self assert: sum equals: 3 ] ifUnused: [ self fail ]
@@ -0,0 +1,17 @@
tests-Combining
testWithReturnWhenBothAreUnused

| firstOptional secondOptional combinedOptional |

firstOptional := Optional unused.
secondOptional := Optional unused.

combinedOptional := firstOptional with: secondOptional return: [ :x :y | self fail ].

self
assert:
(combinedOptional
withContentDo: [ :sum | self fail ]
ifUnused: [ :explanations |
self assert: explanations isEmpty.
0 ]) isZero
@@ -0,0 +1,11 @@
tests-Combining
testWithReturnWhenFirstIsUnused

| firstOptional secondOptional combinedOptional |

firstOptional := Optional unused.
secondOptional := Optional containing: 2.

combinedOptional := firstOptional with: secondOptional return: [ :x :y | self fail ].

self assert: (combinedOptional withContentDo: [ :sum | self fail ] ifUnused: [ 0 ]) isZero
@@ -0,0 +1,11 @@
tests-Combining
testWithReturnWhenSecondIsUnused

| firstOptional secondOptional combinedOptional |

firstOptional := Optional containing: 2.
secondOptional := Optional unused.

combinedOptional := firstOptional with: secondOptional return: [ :x :y | self fail ].

self assert: (combinedOptional withContentDo: [ :sum | self fail ] ifUnused: [ 0 ]) isZero
@@ -0,0 +1,21 @@
{
"instance" : {
"testWithContentDoIfUnused" : "GabrielOmarCotelli 3/16/2017 12:18",
"testForEveryInjectIntoWhenSomeUnused" : "GabrielOmarCotelli 3/16/2017 15:14",
"testWithAllReturnWhenEmpty" : "GabrielOmarCotelli 3/16/2017 15:24",
"testForEveryUsedOptionalInjectInto" : "GabrielOmarCotelli 3/16/2017 15:09",
"testWithReturnWhenBothAreUnused" : "GabrielOmarCotelli 3/16/2017 12:29",
"testWithReturnWhenFirstIsUnused" : "GabrielOmarCotelli 3/16/2017 12:31",
"testWithAllReturnWhenSomeAreUnused" : "GabrielOmarCotelli 3/16/2017 15:22",
"testForEveryInjectIntoWhenFirstUnused" : "GabrielOmarCotelli 3/16/2017 15:16",
"testWithContentDoIfUnusedWhenUnused" : "GabrielOmarCotelli 3/16/2017 12:20",
"testWithAllReturn" : "GabrielOmarCotelli 3/16/2017 15:21",
"testWithReturnWhenSecondIsUnused" : "GabrielOmarCotelli 3/16/2017 12:31",
"testForEveryInjectIntoWhenEmpty" : "GabrielOmarCotelli 3/16/2017 15:13",
"testWithContentDo" : "GabrielOmarCotelli 3/16/2017 11:04",
"testWithContentDoWhenUnused" : "GabrielOmarCotelli 3/16/2017 12:20",
"testWithReturn" : "GabrielOmarCotelli 3/16/2017 12:18",
"testWithAllReturnWhenFirstIsUnused" : "GabrielOmarCotelli 3/16/2017 15:22"
},
"class" : { }
}
@@ -0,0 +1,11 @@
{
"commentStamp" : "<historical>",
"super" : "TestCase",
"category" : "Buoy-Dynamic-Binding-Tests",
"classinstvars" : [ ],
"pools" : [ ],
"classvars" : [ ],
"instvars" : [ ],
"name" : "OptionalTest",
"type" : "normal"
}
@@ -1 +1 @@
(name 'Buoy-Dynamic-Binding-Tests-GabrielOmarCotelli.1' message 'Add Binding' id 'c3216def-2b07-0d00-9c08-b1180dc74540' date '15 March 2017' time '4:46:19.133575 pm' author 'GabrielOmarCotelli' ancestors () stepChildren ())
(name 'Buoy-Dynamic-Binding-Tests-GabrielOmarCotelli.2' message 'Added Optional' id '8c944d20-3f07-0d00-9a97-f70402bbd58a' date '16 March 2017' time '3:40:03.528093 pm' author 'GabrielOmarCotelli' ancestors ((name 'Buoy-Dynamic-Binding-Tests-GabrielOmarCotelli.1' message 'Add Binding' id 'c3216def-2b07-0d00-9c08-b1180dc74540' date '15 March 2017' time '4:46:19.133575 pm' author 'GabrielOmarCotelli' ancestors () stepChildren ())) stepChildren ())
@@ -0,0 +1 @@
I'm an abstract class representing the fact that some object can be optional. I provide protocol to be combined with other optionals.
@@ -0,0 +1,4 @@
Instance Creation
containing: anObject

^UsedOptional containing: anObject
@@ -0,0 +1,4 @@
Instance Creation
forEvery: optionals injectInto: aDyadicBlock

^ optionals ifNotEmpty: [ optionals first withAll: optionals allButFirst injectInto: aDyadicBlock ] ifEmpty: [ self unused ]
@@ -0,0 +1,4 @@
Instance Creation
unused

^self unusedBecauseAll: #()
@@ -0,0 +1,4 @@
Instance Creation
unusedBecause: anExplanation

^self unusedBecauseAll: { anExplanation }
@@ -0,0 +1,4 @@
Instance Creation
unusedBecauseAll: anExplanationCollection

^UnusedOptional explainedByAll: anExplanationCollection
@@ -0,0 +1,4 @@
Instance Creation
withAll: optionals return: aMonadycBlock

^ optionals ifNotEmpty: [ optionals first withAll: optionals allButFirst return: aMonadycBlock ] ifEmpty: [ self unused ]
@@ -0,0 +1,4 @@
Combining
with: anOptional return: aDyadicBlock

^self subclassResponsibility
@@ -0,0 +1,4 @@
Combining
withAll: optionals injectInto: aDyadicBlock

^ optionals inject: self into: [ :combinedOptional :currentOptional | combinedOptional with: currentOptional return: aDyadicBlock ]
@@ -0,0 +1,4 @@
Combining
withAll: optionals return: aMonadycBlock

^self subclassResponsibility
@@ -0,0 +1,4 @@
Accessing
withContentDo: aMonadycBlock

self withContentDo: aMonadycBlock ifUnused: [ ]
@@ -0,0 +1,4 @@
Accessing
withContentDo: aMonadycBlock ifUnused: aNothingBlock

^self subclassResponsibility

0 comments on commit 7db0354

Please sign in to comment.