Fighting with untestable exercises in 'Data Types'
This commit is contained in:
parent
1ec72cc977
commit
8671a04375
|
@ -1,7 +1,7 @@
|
|||
package creatingClasses4
|
||||
|
||||
fun main() {
|
||||
val s = "Hello!"
|
||||
val s: String = "Hello!"
|
||||
println(s.toUpperCase())
|
||||
println(s.toLowerCase())
|
||||
}
|
||||
|
|
|
@ -1,13 +1,15 @@
|
|||
## Mastering the IDE: Quick Documentation
|
||||
|
||||
We've already used <span class="control">`Quick Documentation`</span> action
|
||||
to check the variable type.
|
||||
The <span class="control">`Quick Documentation`</span> action produces
|
||||
information about a symbol, such as a function or a class.
|
||||
Press <span class="shortcut">&shortcut:QuickJavaDoc;</span> when the caret
|
||||
is on a class or a function, and IntelliJ Idea will show you the available
|
||||
documentation for this function or class.
|
||||
information about any symbol, it can be used to check information about a
|
||||
function or a class. Press <span class="shortcut">&shortcut:QuickJavaDoc;</span>
|
||||
when the caret is on a class or a function usage, and IntelliJ Idea will show
|
||||
you the available documentation for this function or class.
|
||||
|
||||
Call <span class="control">`Quick Documentation`</span> action
|
||||
for the `String` class and its `toUpperCase()` and `toLowerCase()` functions.
|
||||
Call <span class="control">`Quick Documentation`</span> action putting the caret
|
||||
on the `String` type and its `get()` and `length()` member functions.
|
||||
|
||||
Press <span class="shortcut">&shortcut:EditorEscape;</span> to close the
|
||||
quick documentation pop-up.
|
|
@ -1,4 +1,6 @@
|
|||
## Mastering the IDE: Quick Documentation on a Variable
|
||||
## Mastering the IDE: TODO
|
||||
|
||||
Quick Documentation on a Variable
|
||||
|
||||
You can press <span class="shortcut">&shortcut:QuickJavaDoc;</span>
|
||||
or run a <span class="control">`Quick Documentation`</span> action
|
||||
|
|
|
@ -1 +1,34 @@
|
|||
package dataTypesExercise2
|
||||
|
||||
fun main() {
|
||||
val int: Int = 10
|
||||
val double: Double = 1.1
|
||||
val boolean: Boolean = false
|
||||
val string: String = "abc"
|
||||
val character: Char = 'a'
|
||||
|
||||
// Can be combined:
|
||||
// String can be combined with every other type:
|
||||
val si: String = string + int
|
||||
val sd: String = string + double
|
||||
val sb: String = string + boolean
|
||||
val sc: String = string + character
|
||||
|
||||
val d1: Double = int + double
|
||||
val d2: Double = double + int
|
||||
val s1: String = character + string
|
||||
val c1: Char = character + int
|
||||
|
||||
println("The type that can be combined " +
|
||||
"with every other type using '+':")
|
||||
println("String")
|
||||
|
||||
// Can't be combined:
|
||||
// val bb = boolean + boolean
|
||||
// val ic = int + character
|
||||
// val ds = double + string
|
||||
|
||||
println("The type that can't be combined " +
|
||||
"with itself using '+':")
|
||||
println("Boolean")
|
||||
}
|
|
@ -2,5 +2,18 @@ type: edu
|
|||
files:
|
||||
- name: src/Task.kt
|
||||
visible: true
|
||||
- name: test/Tests.kt
|
||||
placeholders:
|
||||
- offset: 201
|
||||
length: 325
|
||||
placeholder_text: TODO() // write some examples
|
||||
- offset: 624
|
||||
length: 6
|
||||
placeholder_text: ???
|
||||
- offset: 660
|
||||
length: 89
|
||||
placeholder_text: TODO() // write some examples
|
||||
- offset: 839
|
||||
length: 7
|
||||
placeholder_text: ???
|
||||
- name: test/output.txt
|
||||
visible: false
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
## Data Types (#2)
|
||||
|
||||
{{ :UNTESTABLE It's impossible to analyze the local variables by reflection }}
|
||||
|
||||
Remove all the type declarations from `Types.kt` and verify that Kotlin
|
||||
successfully infers the types. Now define duplicate but typed definitions which
|
||||
are initialized by the inferred `val`s. Use a trailing underscore for the
|
||||
duplicate definition, for example `val whole_: Int = whole`. Ensure that all
|
||||
the typed definitions match the type inference by Kotlin.
|
||||
Attempt to combine the various `val`s of different types using the `+`
|
||||
operator. Only combine two at a time, and assign each combination to a `val`
|
||||
result. See which types combine. Display to the console the name of the type
|
||||
that can be combined with any other type if it goes first, and the name of the
|
||||
type that can't be combined with itself using `+`.
|
|
@ -1,9 +0,0 @@
|
|||
package dataTypesExercise2
|
||||
|
||||
import org.junit.Test
|
||||
import util.untestable
|
||||
|
||||
class TestDataTypesExercise2 {
|
||||
@Test
|
||||
fun test() = untestable()
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
The type that can be combined with every other type using '+':
|
||||
String
|
||||
The type that can't be combined with itself using '+':
|
||||
Boolean
|
|
@ -1 +1,10 @@
|
|||
package dataTypesExercise3
|
||||
|
||||
// 'a' + 1
|
||||
val c1 = 'b'
|
||||
|
||||
// 'a' + 25
|
||||
val c2 = 'z'
|
||||
|
||||
// 'E' - 2
|
||||
val c3 = 'C'
|
|
@ -2,5 +2,15 @@ type: edu
|
|||
files:
|
||||
- name: src/Task.kt
|
||||
visible: true
|
||||
placeholders:
|
||||
- offset: 48
|
||||
length: 3
|
||||
placeholder_text: '''?'''
|
||||
- offset: 74
|
||||
length: 3
|
||||
placeholder_text: '''?'''
|
||||
- offset: 99
|
||||
length: 3
|
||||
placeholder_text: '''?'''
|
||||
- name: test/Tests.kt
|
||||
visible: false
|
||||
|
|
|
@ -1,9 +1,20 @@
|
|||
## Data Types (#3)
|
||||
|
||||
{{ :UNTESTABLE No specific output is expected }}
|
||||
Guess the results of the following expressions and then check yourself using
|
||||
Kotlin:
|
||||
|
||||
Attempt to combine the various `val`s defined in `Types.kt` using the `+`
|
||||
operator. Only combine two at a time, and assign each combination to a `val`
|
||||
result. Perform an exhaustive set of combinations (every identifier with every
|
||||
other identifier), and see which types combine (if any do). Now add type
|
||||
annotations to the new `val`s which successfully combine.
|
||||
```kotlin
|
||||
val c1 = 'a' + 1
|
||||
val c2 = 'a' + 25
|
||||
val c3 = 'E' - 2
|
||||
```
|
||||
|
||||
Open the 'hint' below to see the explanation of why it works like that.
|
||||
|
||||
<div class="hint">
|
||||
|
||||
Characters are stored as numbers corresponding to their
|
||||
[ASCII codes](https://en.wikipedia.org/wiki/ASCII), so adding an integer to a
|
||||
character produces a new character corresponding to the new code value.
|
||||
|
||||
</div>
|
|
@ -1,9 +1,26 @@
|
|||
package dataTypesExercise3
|
||||
|
||||
import org.junit.Assert
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runners.MethodSorters
|
||||
import util.TIMEOUT
|
||||
import util.untestable
|
||||
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
class TestDataTypesExercise3 {
|
||||
@Test
|
||||
fun test() = untestable()
|
||||
@Test(timeout = TIMEOUT)
|
||||
fun testA() {
|
||||
Assert.assertEquals("Wrong result for 'c1'", 'b', c1)
|
||||
}
|
||||
|
||||
@Test(timeout = TIMEOUT)
|
||||
fun testB() {
|
||||
Assert.assertEquals("Wrong result for 'c2'", 'z', c2)
|
||||
}
|
||||
|
||||
@Test(timeout = TIMEOUT)
|
||||
fun testC() {
|
||||
Assert.assertEquals("Wrong result for 'c3'", 'C', c3)
|
||||
}
|
||||
}
|
|
@ -1,6 +1,28 @@
|
|||
package dataTypes4
|
||||
package dataTypesExercise4
|
||||
|
||||
fun main() {
|
||||
val s = "Sally" + 5.9
|
||||
println(s)
|
||||
val whole = 11
|
||||
val fractional = 1.4
|
||||
val trueOrFalse = true
|
||||
val words = "A value"
|
||||
val character = 'z'
|
||||
val lines = """Triple quotes let
|
||||
you have many lines
|
||||
in your string"""
|
||||
println(whole)
|
||||
println(fractional)
|
||||
println(trueOrFalse)
|
||||
println(words)
|
||||
println(character)
|
||||
println(lines)
|
||||
}
|
||||
/* Output:
|
||||
11
|
||||
1.4
|
||||
true
|
||||
A value
|
||||
z
|
||||
Triple quotes let
|
||||
you have many lines
|
||||
in your string
|
||||
*/
|
|
@ -1,8 +1,6 @@
|
|||
type: ide
|
||||
type: edu
|
||||
files:
|
||||
- name: src/Task.kt
|
||||
visible: true
|
||||
- name: test/Tests.kt
|
||||
visible: false
|
||||
feedback_link: |
|
||||
https://docs.google.com/forms/d/e/1FAIpQLSdkaliSwYkjiV21bZl0yP-In2g5p17sAQCfaGjyHx_QYMWTiQ/viewform?usp=pp_url&entry.189755027=Programming+Basics+%2F+Data+Types+%2F+Exercise2
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
## Mastering the IDE: "Specify Type" Intention
|
||||
## Mastering the IDE: Checking the inferred variable type
|
||||
|
||||
IntelliJ IDEA helps you automatically add type specifications for `val`s and
|
||||
`var`s. Put the caret right after `s` and press
|
||||
<span class="shortcut">&shortcut:ShowIntentionActions;</span>. This is
|
||||
the shortcut for <span class="control">`Show intention actions`</span>.
|
||||
Choose <span class="control">`Specify type explicitly`</span> in the dropdown menu.
|
||||
In the accompanying example, all the type declarations from `Types.kt` are
|
||||
removed. Verify that Kotlin successfully infers the types.
|
||||
|
||||
Different intention actions are available in different contexts, depending on
|
||||
where you put the caret.
|
||||
You can press <span class="shortcut">&shortcut:QuickJavaDoc;</span>
|
||||
while having the caret on an identifier to check the type Kotlin infers
|
||||
for this identifier.
|
||||
|
||||
Press <span class="shortcut">&shortcut:EditorEscape;</span> to close the pop-up.
|
||||
|
||||
Check the types of all the declared variables in the example.
|
|
@ -1 +1 @@
|
|||
package dataTypes4
|
||||
package dataTypesExercise4
|
|
@ -0,0 +1,6 @@
|
|||
package dataTypesExercise5
|
||||
|
||||
fun main() {
|
||||
val s = "Sally" + 5.9
|
||||
println(s)
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
type: ide
|
||||
files:
|
||||
- name: src/Task.kt
|
||||
visible: true
|
||||
- name: test/Tests.kt
|
||||
visible: false
|
||||
feedback_link: |
|
||||
https://docs.google.com/forms/d/e/1FAIpQLSdkaliSwYkjiV21bZl0yP-In2g5p17sAQCfaGjyHx_QYMWTiQ/viewform?usp=pp_url&entry.189755027=Programming+Basics+%2F+Data+Types+%2F+Exercise2
|
|
@ -0,0 +1,10 @@
|
|||
## Mastering the IDE: "Specify Type" Intention
|
||||
|
||||
IntelliJ IDEA helps you automatically add type specifications for `val`s and
|
||||
`var`s. Put the caret right after `s` and press
|
||||
<span class="shortcut">&shortcut:ShowIntentionActions;</span>. This is
|
||||
the shortcut for <span class="control">`Show intention actions`</span>.
|
||||
Choose <span class="control">`Specify type explicitly`</span> in the dropdown menu.
|
||||
|
||||
Different intention actions are available in different contexts, depending on
|
||||
where you put the caret.
|
|
@ -0,0 +1 @@
|
|||
package dataTypesExercise5
|
|
@ -4,3 +4,4 @@ content:
|
|||
- Exercise 2
|
||||
- Exercise 3
|
||||
- Exercise 4
|
||||
- Exercise 5
|
||||
|
|
|
@ -10,21 +10,21 @@ import util.TIMEOUT
|
|||
class TestNumberTypesExercise1 {
|
||||
@Test(timeout = TIMEOUT)
|
||||
fun testA() {
|
||||
Assert.assertEquals(3, a)
|
||||
Assert.assertEquals("Wrong result for 'a'", 3, a)
|
||||
}
|
||||
|
||||
@Test(timeout = TIMEOUT)
|
||||
fun testB() {
|
||||
Assert.assertEquals(2, b)
|
||||
Assert.assertEquals("Wrong result for 'b'", 2, b)
|
||||
}
|
||||
|
||||
@Test(timeout = TIMEOUT)
|
||||
fun testC() {
|
||||
Assert.assertEquals(11, c)
|
||||
Assert.assertEquals("Wrong result for 'c'", 11, c)
|
||||
}
|
||||
|
||||
@Test(timeout = TIMEOUT)
|
||||
fun testD() {
|
||||
Assert.assertEquals(1.2, d.toDouble(), 0.0001)
|
||||
Assert.assertEquals("Wrong result for 'd'", 1.2, d.toDouble(), 0.0001)
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -24,7 +24,7 @@ class TestAllExercises : AbstractTestExercises() {
|
|||
fun testDataTypesExercise1() = testClass(dataTypesExercise1.TestDataTypesExercise1::class)
|
||||
|
||||
@Test
|
||||
fun testDataTypesExercise2() = testClass(dataTypesExercise2.TestDataTypesExercise2::class)
|
||||
fun testDataTypesExercise2() = testOutput("../AtomicKotlinCourse/Programming Basics/Data Types/Exercise 2/test/output.txt"){ dataTypesExercise2.main() }
|
||||
|
||||
@Test
|
||||
fun testDataTypesExercise3() = testClass(dataTypesExercise3.TestDataTypesExercise3::class)
|
||||
|
|
Loading…
Reference in New Issue