summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2025-11-23 17:01:59 +0100
committerEugen Wissner <belka@caraus.de>2025-11-23 17:01:59 +0100
commitbf11813e4fa859a4833cab226c4ea560765d6d77 (patch)
tree480e175d8dbb27376841c27dd4250f89f7bfb9a9
parent8568518b57dba05500b63a4e471f8fa65883d10a (diff)
downloadbook-exercises-bf11813e4fa859a4833cab226c4ea560765d6d77.tar.gz
Add ReDo Pharo excercises
-rw-r--r--pharo-mooc/redo/.project3
-rw-r--r--pharo-mooc/redo/src/.properties3
-rw-r--r--pharo-mooc/redo/src/Dice/Die.class.st47
-rw-r--r--pharo-mooc/redo/src/Dice/DieHandle.class.st61
-rw-r--r--pharo-mooc/redo/src/Dice/DieHandleTest.class.st61
-rw-r--r--pharo-mooc/redo/src/Dice/DieTest.class.st30
-rw-r--r--pharo-mooc/redo/src/Dice/Integer.extension.st28
-rw-r--r--pharo-mooc/redo/src/Dice/package.st1
-rw-r--r--pharo-mooc/redo/src/MyCounter/Counter.class.st60
-rw-r--r--pharo-mooc/redo/src/MyCounter/CounterTest.class.st55
-rw-r--r--pharo-mooc/redo/src/MyCounter/package.st1
11 files changed, 350 insertions, 0 deletions
diff --git a/pharo-mooc/redo/.project b/pharo-mooc/redo/.project
new file mode 100644
index 0000000..81083cc
--- /dev/null
+++ b/pharo-mooc/redo/.project
@@ -0,0 +1,3 @@
+{
+ 'srcDirectory' : 'src'
+} \ No newline at end of file
diff --git a/pharo-mooc/redo/src/.properties b/pharo-mooc/redo/src/.properties
new file mode 100644
index 0000000..ad0471d
--- /dev/null
+++ b/pharo-mooc/redo/src/.properties
@@ -0,0 +1,3 @@
+{
+ #format : #tonel
+} \ No newline at end of file
diff --git a/pharo-mooc/redo/src/Dice/Die.class.st b/pharo-mooc/redo/src/Dice/Die.class.st
new file mode 100644
index 0000000..07b844a
--- /dev/null
+++ b/pharo-mooc/redo/src/Dice/Die.class.st
@@ -0,0 +1,47 @@
+Class {
+ #name : #Die,
+ #superclass : #Object,
+ #instVars : [
+ 'faces'
+ ],
+ #category : #Dice
+}
+
+{ #category : #'instance creation' }
+Die class >> withFaces: anInteger [
+
+ | d |
+ d := Die new.
+ d faces: anInteger.
+ ^ d
+]
+
+{ #category : #accessing }
+Die >> faces [
+ ^ faces
+]
+
+{ #category : #accessing }
+Die >> faces: anInteger [
+ faces := anInteger
+]
+
+{ #category : #initialization }
+Die >> initialize [
+
+ super initialize.
+ faces := 6
+]
+
+{ #category : #initialization }
+Die >> printOn: aStream [
+
+ super printOn: aStream.
+ aStream nextPutAll: ' (', faces printString, ')'
+]
+
+{ #category : #accessing }
+Die >> roll [
+
+ ^ faces atRandom
+]
diff --git a/pharo-mooc/redo/src/Dice/DieHandle.class.st b/pharo-mooc/redo/src/Dice/DieHandle.class.st
new file mode 100644
index 0000000..6820367
--- /dev/null
+++ b/pharo-mooc/redo/src/Dice/DieHandle.class.st
@@ -0,0 +1,61 @@
+Class {
+ #name : #DieHandle,
+ #superclass : #Object,
+ #instVars : [
+ 'dice'
+ ],
+ #category : #Dice
+}
+
+{ #category : #initialization }
+DieHandle >> + aDieHandle [
+
+ | handle |
+ handle := self class new.
+ self dice do: [ :each | handle addDie: each ].
+ aDieHandle dice do: [ :each | handle addDie: each ].
+ ^ handle
+]
+
+{ #category : #initialization }
+DieHandle >> addDie: aDie [
+
+ dice add: aDie
+]
+
+{ #category : #initialization }
+DieHandle >> dice [
+
+ ^ dice
+]
+
+{ #category : #initialization }
+DieHandle >> diceNumber [
+
+ ^ dice size
+]
+
+{ #category : #initialization }
+DieHandle >> initialize [
+
+ super initialize.
+ dice := OrderedCollection new.
+]
+
+{ #category : #accessing }
+DieHandle >> maxValue [
+
+ | res |
+ res := 0.
+ dice do: [ :each | res := res + each faces ].
+ ^ res
+]
+
+{ #category : #accessing }
+DieHandle >> roll [
+
+ | res |
+ res := 0.
+ dice do: [ :each | res := res + each roll ].
+ ^ res
+]
diff --git a/pharo-mooc/redo/src/Dice/DieHandleTest.class.st b/pharo-mooc/redo/src/Dice/DieHandleTest.class.st
new file mode 100644
index 0000000..ac6bc55
--- /dev/null
+++ b/pharo-mooc/redo/src/Dice/DieHandleTest.class.st
@@ -0,0 +1,61 @@
+Class {
+ #name : #DieHandleTest,
+ #superclass : #TestCase,
+ #category : #Dice
+}
+
+{ #category : #tests }
+DieHandleTest >> testCreationAndAdding [
+
+ | handle |
+ handle := DieHandle new
+ addDie: (Die withFaces: 6);
+ addDie: (Die withFaces: 10);
+ yourself.
+ self assert: handle diceNumber equals: 2
+]
+
+{ #category : #tests }
+DieHandleTest >> testCreationWithTheSameDice [
+
+ | handle |
+ handle := DieHandle new addDie: (Die withFaces: 6).
+ self assert: handle diceNumber equals: 1.
+ handle addDie: (Die withFaces: 6).
+ self assert: handle diceNumber equals: 2.
+]
+
+{ #category : #tests }
+DieHandleTest >> testMaxValue [
+
+ | handle |
+ handle := DieHandle new
+ addDie: (Die withFaces: 6);
+ addDie: (Die withFaces: 10);
+ yourself.
+ self assert: handle maxValue equals: 16
+]
+
+{ #category : #tests }
+DieHandleTest >> testRoll [
+
+ | handle |
+ handle := DieHandle new
+ addDie: (Die withFaces: 6);
+ addDie: (Die withFaces: 10);
+ yourself.
+ 10 timesRepeat:
+ [ self assert: (handle roll between: handle diceNumber and: handle maxValue) ]
+]
+
+{ #category : #tests }
+DieHandleTest >> testSimpleHandle [
+
+ self assert: 2 D20 equals: 2
+]
+
+{ #category : #tests }
+DieHandleTest >> testSumming [
+
+ self assert: (3 D4 + 2 D6) diceNumber equals: 5
+]
diff --git a/pharo-mooc/redo/src/Dice/DieTest.class.st b/pharo-mooc/redo/src/Dice/DieTest.class.st
new file mode 100644
index 0000000..f62b2af
--- /dev/null
+++ b/pharo-mooc/redo/src/Dice/DieTest.class.st
@@ -0,0 +1,30 @@
+Class {
+ #name : #DieTest,
+ #superclass : #TestCase,
+ #category : #Dice
+}
+
+{ #category : #tests }
+DieTest >> testCreationIsOk [
+
+ | d |
+ d := Die withFaces: 20.
+ self assert: d faces equals: 20
+]
+
+{ #category : #tests }
+DieTest >> testInitializationIsOk [
+
+ | d |
+ d := Die new.
+ self assert: d faces equals: 6
+]
+
+{ #category : #tests }
+DieTest >> testRolling [
+
+ | d |
+ d := Die new.
+ 10 timesRepeat:
+ [ self assert: (d roll between: 1 and: 6) ]
+]
diff --git a/pharo-mooc/redo/src/Dice/Integer.extension.st b/pharo-mooc/redo/src/Dice/Integer.extension.st
new file mode 100644
index 0000000..f97a827
--- /dev/null
+++ b/pharo-mooc/redo/src/Dice/Integer.extension.st
@@ -0,0 +1,28 @@
+Extension { #name : #Integer }
+
+{ #category : #'*Dice' }
+Integer >> D20 [
+
+ self D: 20
+]
+
+{ #category : #'*Dice' }
+Integer >> D4 [
+
+ ^ self D: 4
+]
+
+{ #category : #'*Dice' }
+Integer >> D6 [
+
+ ^ self D: 6
+]
+
+{ #category : #'*Dice' }
+Integer >> D: anInteger [
+
+ | handle |
+ handle := DieHandle new.
+ self timesRepeat: [ handle addDie: (Die withFaces: anInteger) ].
+ ^ handle
+]
diff --git a/pharo-mooc/redo/src/Dice/package.st b/pharo-mooc/redo/src/Dice/package.st
new file mode 100644
index 0000000..30779b6
--- /dev/null
+++ b/pharo-mooc/redo/src/Dice/package.st
@@ -0,0 +1 @@
+Package { #name : #Dice }
diff --git a/pharo-mooc/redo/src/MyCounter/Counter.class.st b/pharo-mooc/redo/src/MyCounter/Counter.class.st
new file mode 100644
index 0000000..2d65fa1
--- /dev/null
+++ b/pharo-mooc/redo/src/MyCounter/Counter.class.st
@@ -0,0 +1,60 @@
+"
+Counter is a simple concrete class which supports incrementing and
+decrementing a counter.
+
+Its API is
+- decrement, increment
+- count
+Its creation API is message startingAt:
+"
+Class {
+ #name : #Counter,
+ #superclass : #Object,
+ #instVars : [
+ 'count'
+ ],
+ #category : #MyCounter
+}
+
+{ #category : #accessing }
+Counter class >> startingAt: anInteger [
+ ^ self new count: anInteger
+]
+
+{ #category : #accessing }
+Counter >> count [
+
+ ^ count
+]
+
+{ #category : #accessing }
+Counter >> count: anInteger [
+
+ count := anInteger
+]
+
+{ #category : #operation }
+Counter >> decrement [
+
+ count := count - 1
+]
+
+{ #category : #operation }
+Counter >> increment [
+
+ count := count + 1
+]
+
+{ #category : #initialization }
+Counter >> initialize [
+ super initialize.
+ count := 0
+]
+
+{ #category : #accessing }
+Counter >> printOn: aStream [
+
+ super printOn: aStream. "a Counter"
+ aStream nextPutAll: ' withValue: ', count printString.
+ aStream cr
+]
diff --git a/pharo-mooc/redo/src/MyCounter/CounterTest.class.st b/pharo-mooc/redo/src/MyCounter/CounterTest.class.st
new file mode 100644
index 0000000..ba2afe5
--- /dev/null
+++ b/pharo-mooc/redo/src/MyCounter/CounterTest.class.st
@@ -0,0 +1,55 @@
+Class {
+ #name : #CounterTest,
+ #superclass : #TestCase,
+ #category : #MyCounter
+}
+
+{ #category : #tests }
+CounterTest >> testCountIsSetAndRead [
+ | c |
+ c := Counter new.
+ c count: 7.
+ self assert: c count equals: 7
+]
+
+{ #category : #tests }
+CounterTest >> testCounterWellInitialized [
+ self assert: (Counter new increment; increment; count) equals: 2
+]
+
+{ #category : #tests }
+CounterTest >> testDecrement [
+ | c |
+ c := Counter new.
+ c count: 2.
+ c decrement; decrement.
+ self assert: c count equals: 0
+]
+
+{ #category : #tests }
+CounterTest >> testIncrement [
+ | c |
+ c := Counter new.
+ c count: 2.
+ c increment; increment.
+ self assert: c count equals: 4
+]
+
+{ #category : #tests }
+CounterTest >> testInizialize [
+ self assert: Counter new count equals: 0
+]
+
+{ #category : #tests }
+CounterTest >> testStartingAt5 [
+ | c |
+ c := Counter startingAt: 5.
+ self assert: c count equals: 5
+]
+
+{ #category : #tests }
+CounterTest >> testStartingAt5Increment [
+ | c |
+ c := Counter startingAt: 5.
+ self assert: (c increment; count) equals: 6
+]
diff --git a/pharo-mooc/redo/src/MyCounter/package.st b/pharo-mooc/redo/src/MyCounter/package.st
new file mode 100644
index 0000000..242e6c9
--- /dev/null
+++ b/pharo-mooc/redo/src/MyCounter/package.st
@@ -0,0 +1 @@
+Package { #name : #MyCounter }