Skip to content

Commit

Permalink
Merge pull request #58 from hpi-swa-teaching/dev
Browse files Browse the repository at this point in the history
dev merge into main
  • Loading branch information
yeji0205 authored Jul 12, 2024
2 parents 330261d + d251a5a commit 858f742
Show file tree
Hide file tree
Showing 42 changed files with 2,979 additions and 2,062 deletions.
946 changes: 661 additions & 285 deletions src/SqueakLanguageLearning/SLGAbstractPage.class.st

Large diffs are not rendered by default.

69 changes: 37 additions & 32 deletions src/SqueakLanguageLearning/SLGAnswerEvaluator.class.st
Original file line number Diff line number Diff line change
@@ -1,96 +1,101 @@
"
This class is a Mock Object for SLGTask supporting all methods to validate and verify user input.
"
Class {
#name : #SLGAnswerEvaluator,
#superclass : #Object,
#instVars : [
'correctAnswer'
],
#category : #'SqueakLanguageLearning-Tests'
#category : #'SqueakLanguageLearning-Tests',
#'squeak_changestamp' : 'SW 7/5/2024 17:23'
}

{
#category : #'as yet unclassified',
#'squeak_changestamp' : 'EB 6/14/2024 11:23'
#category : #verification,
#'squeak_changestamp' : 'SW 7/5/2024 17:37'
}
SLGAnswerEvaluator >> calculatePercentage: aValue with: aTotal [

| percentage |
percentage := ((aValue / aTotal) * 100) rounded.

^ percentage
]

{
#category : #'as yet unclassified',
#'squeak_changestamp' : 'EB 6/14/2024 11:23'
#category : #verification,
#'squeak_changestamp' : 'SW 7/5/2024 17:37'
}
SLGAnswerEvaluator >> calculateResult: anUserInput [

| comparison percentage |

Transcript show: 'No Error occurred.'; cr.

comparison := self findMatches: self correctAnswer with: anUserInput.
percentage := self calculatePercentage: (comparison size) with: (self correctAnswer size).

^ percentage
]

{
#category : #'as yet unclassified',
#'squeak_changestamp' : 'EB 6/14/2024 11:31'
#category : #accessing,
#'squeak_changestamp' : 'SW 7/6/2024 14:23'
}
SLGAnswerEvaluator >> correctAnswer [
^ correctAnswer.
^ correctAnswer
]

{
#category : #'as yet unclassified',
#category : #accessing,
#'squeak_changestamp' : 'EB 6/14/2024 11:30'
}
SLGAnswerEvaluator >> correctAnswer: anAnswer [
correctAnswer := anAnswer.
]

{
#category : #'as yet unclassified',
#'squeak_changestamp' : 'EB 6/14/2024 11:23'
#category : #verification,
#'squeak_changestamp' : 'SW 7/5/2024 17:37'
}
SLGAnswerEvaluator >> findMatches: correctAnswer with: userAnswer [
"Mock implementation: find matching characters between two strings"
"Mock implementation: Find matching characters between two strings."

| matches |
matches := ''.
1 to: (correctAnswer size min: userAnswer size) do: [:i |
(correctAnswer at: i) = (userAnswer at: i) ifTrue: [
matches := matches , (correctAnswer at: i) asString.
].
].
1 to: (correctAnswer size min: userAnswer size) do: [:index |
(correctAnswer at: index) = (userAnswer at: index)
ifTrue: [matches := matches , (correctAnswer at: index) asString]].

^ matches
]

{
#category : #'as yet unclassified',
#'squeak_changestamp' : 'EB 6/14/2024 11:17'
#category : #verification,
#'squeak_changestamp' : 'SW 7/5/2024 17:34'
}
SLGAnswerEvaluator >> isValid: anUserInput [
"Mock implementation: returns true for non-empty strings"
"Mock implementation: Returns true for non-empty strings."

^ anUserInput isEmpty not

]

{
#category : #'as yet unclassified',
#'squeak_changestamp' : 'EB 6/14/2024 11:17'
#category : #verification,
#'squeak_changestamp' : 'SW 7/5/2024 17:34'
}
SLGAnswerEvaluator >> sendError [
"Mock implementation: returns 'Invalid Input' for invalid input"
"Mock implementation: Returns 'Invalid Input' for invalid input."

^ 'Invalid Input'
]

{
#category : #'as yet unclassified',
#'squeak_changestamp' : 'EB 6/14/2024 11:18'
#category : #verification,
#'squeak_changestamp' : 'SW 7/5/2024 17:37'
}
SLGAnswerEvaluator >> verifyAnswer: anUserInput [
SLGAnswerEvaluator >> verifyAnswer: anUserInput [

| output |

Transcript show: 'isValid: ', (self isValid: anUserInput) printString; cr.

(self isValid: anUserInput)
ifTrue: [ output := self calculateResult: anUserInput ]
ifFalse: [ output := self sendError ].
Expand Down
112 changes: 77 additions & 35 deletions src/SqueakLanguageLearning/SLGAnswerEvaluatorTest.class.st
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
"
This class ensures the accuracy of user input verification for SLGTask by employing the Mock Object SLGAnswerEvaluator instead of directly interacting with SLGTask.
"
Class {
#name : #SLGAnswerEvaluatorTest,
#superclass : #TestCase,
#category : #'SqueakLanguageLearning-Tests'
#category : #'SqueakLanguageLearning-Tests',
#'squeak_changestamp' : 'SW 7/5/2024 17:23'
}

{
#category : #'as yet unclassified',
#category : #'test configuration',
#'squeak_changestamp' : 'EB 6/17/2024 14:25'
}
SLGAnswerEvaluatorTest class >> classNamesNotUnderTest [
Expand All @@ -14,97 +18,135 @@ SLGAnswerEvaluatorTest class >> classNamesNotUnderTest [
]

{
#category : #'as yet unclassified',
#'squeak_changestamp' : 'EB 6/14/2024 11:18'
#category : #tests,
#'squeak_changestamp' : 'SW 7/5/2024 17:36'
}
SLGAnswerEvaluatorTest class >> test [
^self new run
SLGAnswerEvaluatorTest >> testCalculatePercentageNoMatch [

| evaluator result |
evaluator := SLGAnswerEvaluator new.
result := evaluator calculatePercentage: 0 with: 5.

self assert: result = 0
]

{
#category : #'as yet unclassified',
#'squeak_changestamp' : 'yegi 6/20/2024 02:42'
#category : #tests,
#'squeak_changestamp' : 'SW 7/5/2024 17:37'
}
SLGAnswerEvaluatorTest >> testCalculatePercentage [
SLGAnswerEvaluatorTest >> testCalculatePercentagePartialMatch [

| evaluator result |
evaluator := SLGAnswerEvaluator new.
result := evaluator calculatePercentage: 4 with: 5.

self assert: result = 80
]

{
#category : #tests,
#'squeak_changestamp' : 'SW 7/5/2024 17:37'
}
SLGAnswerEvaluatorTest >> testCalculatePercentagePerfectMatch [

"Test case 1: perfect match"
| evaluator result |
evaluator := SLGAnswerEvaluator new.
result := evaluator calculatePercentage: 5 with: 5.
self assert: result = 100.

"Test case 2: partial match"
result := evaluator calculatePercentage: 4 with: 5.
self assert: result = 80.
self assert: result = 100
]

"Test case 3: no match"
result := evaluator calculatePercentage: 0 with: 5.
self assert: result = 0.
{
#category : #tests,
#'squeak_changestamp' : 'SW 7/5/2024 17:37'
}
SLGAnswerEvaluatorTest >> testCalculatePercentageRounding [

"Test case 4: rounding"
| evaluator result |
evaluator := SLGAnswerEvaluator new.
result := evaluator calculatePercentage: 1 with: 3.
self assert: result = 33.

"Test case 5: zero total (should handle division by zero)"
self should: [evaluator calculatePercentage: 1 with: 0] raise: ZeroDivide.
self assert: result = 33
]

{
#category : #tests,
#'squeak_changestamp' : 'SW 7/5/2024 17:37'
}
SLGAnswerEvaluatorTest >> testCalculatePercentageZeroTotal [

| evaluator |
evaluator := SLGAnswerEvaluator new.

self should: [evaluator calculatePercentage: 1 with: 0] raise: ZeroDivide
]

{
#category : #'as yet unclassified',
#'squeak_changestamp' : 'yegi 6/20/2024 02:42'
#category : #tests,
#'squeak_changestamp' : 'SW 7/5/2024 17:37'
}
SLGAnswerEvaluatorTest >> testCalculateResultWithMatchingInput [

| evaluator result |
evaluator := SLGAnswerEvaluator new.
evaluator correctAnswer: 'hello'.
result := evaluator calculateResult: 'hello'.

self assert: result = 100.
]

{
#category : #'as yet unclassified',
#'squeak_changestamp' : 'yegi 6/20/2024 02:42'
#category : #tests,
#'squeak_changestamp' : 'SW 7/5/2024 17:37'
}
SLGAnswerEvaluatorTest >> testCalculateResultWithNonMatchingInput [

| evaluator result |
evaluator := SLGAnswerEvaluator new.
evaluator correctAnswer: 'hey'.
result := evaluator calculateResult: 'world'.
self assert: result = 0.

self assert: result = 0
]

{
#category : #'as yet unclassified',
#'squeak_changestamp' : 'yegi 6/20/2024 02:42'
#category : #tests,
#'squeak_changestamp' : 'SW 7/5/2024 17:37'
}
SLGAnswerEvaluatorTest >> testCalculateResultWithPartialMatchingInput [

| evaluator result |
evaluator := SLGAnswerEvaluator new.
evaluator correctAnswer: 'hello'.
result := evaluator calculateResult: 'hallo'.
self assert: result = 80.

self assert: result = 80
]

{
#category : #'as yet unclassified',
#'squeak_changestamp' : 'yegi 6/20/2024 02:42'
#category : #tests,
#'squeak_changestamp' : 'SW 7/5/2024 17:37'
}
SLGAnswerEvaluatorTest >> testVerifyAnswerWithInvalidInput [

| evaluator result |
evaluator := SLGAnswerEvaluator new.
evaluator correctAnswer: 'hello'.
result := evaluator verifyAnswer: ''.
self assert: result = 'Invalid Input'.

self assert: result = 'Invalid Input'
]

{
#category : #'as yet unclassified',
#'squeak_changestamp' : 'yegi 6/20/2024 02:42'
#category : #tests,
#'squeak_changestamp' : 'SW 7/5/2024 17:37'
}
SLGAnswerEvaluatorTest >> testVerifyAnswerWithValidInput [

| evaluator result |
evaluator := SLGAnswerEvaluator new.
evaluator correctAnswer: 'hello'.
result := evaluator verifyAnswer: 'hello'.
self assert: result = 100.

self assert: result = 100
]
Loading

0 comments on commit 858f742

Please sign in to comment.