Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Statements & Testing modules added + little additions to .gitignore(.idea added) #3

Merged
merged 6 commits into from
Dec 7, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
/**/logs/
*.DS_Store
.idea
2 changes: 1 addition & 1 deletion modules/10-basics/20-comments/Main.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ fun main() {
// BEGIN
// You know nothing, Jon Snow!
// END
}
}
3 changes: 2 additions & 1 deletion modules/10-basics/20-comments/Makefile
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
test:
@ test.sh
@ test.sh

32 changes: 32 additions & 0 deletions modules/10-basics/20-comments/Test.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import java.io.BufferedReader
import java.io.InputStreamReader
import java.nio.charset.StandardCharsets
import java.util.stream.Collectors

fun main() {
val expected = ""

val p = Runtime.getRuntime().exec("kotlin -classpath Main.jar MainKt")
p.waitFor()
val input = BufferedReader(
InputStreamReader(p.inputStream, StandardCharsets.UTF_8)
)
.lines()
.collect(Collectors.joining("\n"))
val error = BufferedReader(
InputStreamReader(p.errorStream, StandardCharsets.UTF_8))
.lines()
.collect(Collectors.joining("\n"))

if (!expected.equals(input) || error.isNotBlank()) {
println("Test(statements): ERROR")
throw Exception(
"Expected: "
+ expected
+ ", but got: "
+ input
+ "\n"
+ error
)
}
}
1 change: 0 additions & 1 deletion modules/10-basics/20-comments/description.ru.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,3 @@ instructions: |
tips:
- |
[Документация Kotlin кода](https://kotlinlang.org/docs/kotlin-doc.html)

7 changes: 7 additions & 0 deletions modules/10-basics/30-statements/Main.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
fun main() {
// BEGIN
println("Robert")
println("Stannis")
println("Renly")
// END
}
2 changes: 2 additions & 0 deletions modules/10-basics/30-statements/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
test:
@ test.sh
34 changes: 34 additions & 0 deletions modules/10-basics/30-statements/Test.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import java.io.BufferedReader
import java.io.InputStreamReader
import java.nio.charset.StandardCharsets
import java.util.stream.Collectors

fun main() {
val expected = "Robert\nStannis\nRenly"

val p = Runtime.getRuntime().exec("kotlin -classpath Main.jar MainKt")
p.waitFor()
val input = BufferedReader(
InputStreamReader(p.inputStream, StandardCharsets.UTF_8)
)
.lines()
.collect(Collectors.joining("\n"))
val error = BufferedReader(
InputStreamReader(p.errorStream, StandardCharsets.UTF_8))
.lines()
.collect(Collectors.joining("\n"))

println(input)

if (!expected.equals(input) || error.isNotBlank()) {
println("Test(statements): ERROR")
throw Exception(
"Expected: "
+ expected
+ ", but got: "
+ input
+ "\n"
+ error
)
}
}
38 changes: 38 additions & 0 deletions modules/10-basics/30-statements/description.ru.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
---

name: Инструкции (Statements)
theory: |
Инструкция - команда для компьютера. Код на Kotlin - это набор инструкций, которые в отличии от Java, не обязательно должны быть отделены друг от друга символом `;`. Вот пример кода с двумя инструкциями:

```kotlin
println("Mother of Dragons")
println("Dracarys!")
```

При запуске этого когда на экран последовательно выведутся два предложения:

<pre class='hexlet-basics-output'>
Mother of Dragons
Dracarys!
</pre>

Почему это важно знать? Инструкция - единица исполнения, и программа, которая запускает код на Kotlin, выполняет инструкции строго по очереди. И мы, как разработчики, должны понимать этот порядок и уметь мысленно разделять программу на независимые части, удобные для анализа.

Теоретически инструкции можно написать последовально друг за другом без переноса на новую строку:

```kotlin
println("Mother of Dragons."); println("Dracarys!") // в таком случае - использовать `;` является обязательным
```

Результат будет такой же, но на практике такой подход считает плохим

instructions: |
Выведите на экран друг за другом три имени: *Robert*, *Stannis*, *Renly*. В результате на экране должно отобразиться:

<pre class='hexlet-basics-output'>
Robert
Stannis
Renly
</pre>

Для каждого имени используйте свой собственный вывод 'println()'.
5 changes: 5 additions & 0 deletions modules/10-basics/40-testing/Main.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
fun main() {
// BEGIN
print(420262531)
// END
}
2 changes: 2 additions & 0 deletions modules/10-basics/40-testing/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
test:
@ test.sh
33 changes: 33 additions & 0 deletions modules/10-basics/40-testing/Test.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import java.io.BufferedReader
import java.io.InputStreamReader
import java.nio.charset.StandardCharsets
import java.util.stream.Collectors

fun main() {
val expected = 420262531

val p = Runtime.getRuntime().exec("kotlin -classpath Main.jar MainKt")
p.waitFor()
val input = BufferedReader(
InputStreamReader(p.inputStream, StandardCharsets.UTF_8)
).lines()
.collect(Collectors.joining(""))
.toInt()

val error = BufferedReader(
InputStreamReader(p.errorStream, StandardCharsets.UTF_8))
.lines()
.collect(Collectors.joining("\n"))

if (!expected.equals(input) || error.isNotBlank()) {
println("Test(statements): ERROR")
throw Exception(
"Expected: "
+ expected
+ ", but got: "
+ input
+ "\n"
+ error
)
}
}
41 changes: 41 additions & 0 deletions modules/10-basics/40-testing/description.ru.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
---

name: Как мы проверяем ваши решения
theory: |
Наш сайт автоматически проверяет ваши решения. Как это работает?

В самом простом случае система просто запускает ваш код и смотрит на то, что вывелось на экран. А потом сверяет с тем, что мы «ожидали» по заданию.

В следующих, более сложных уроках вы будете писать методы — некие мини-программы, принимающие информацию из внешнего мира и производящие какие-то операции. Проверка ваших решений в таких случаях выглядит немного сложнее: система запускает ваше решение и передаёт какую-то информацию. Система также знает — «ожидает» — какой именно ответ должен вернуть правильный метод при таких входных данных.

Например, если ваша задача — написать код для сложения двух чисел, то проверочная система будет передавать ему разные комбинации чисел и сверять ответ вашего кода с реальными суммами. Если во всех случаях ответы совпадут, то решение считается верным.

Вот простой пример: в одном из будущих уроков вам нужно будет написать код, который производит вычисления и выдаёт ответ. Допустим, вы допустили небольшую ошибку, и метод выдал неправильное число. Система ответит примерно так:

<pre class='hexlet-basics-output'>expected: "35" but got: "10"</pre>

Самое главное начинается после двоеточия: «ожидалось: "35", но было "10"». То есть правильный код должен был выдать 35, но текущее решение работает неправильно и выдаёт 10.

Кроме наших тестов, будет крайне полезно экспериментировать с кодом в консоли [Repl.it](https://replit.com/languages/kotlin). В любой ситуации, когда вы недопоняли, или хотите попробовать разные варианты использования, смело открывайте консоль и вводите туда код. Идеально, если вы выполните самостоятельно весь код, который присутствует в уроках.

---

Иногда в процессе решения будет казаться, что вы сделали все правильно, но система "капризничает" и не принимает решение. Подобное поведение практически исключено. Нерабочие тесты просто не могут попасть на сайт, они автоматически запускаются после каждого изменения. В подавляющем большинстве таких случаев, (а все наши проекты в сумме провели миллионы проверок за много лет), ошибка содержится в коде решения. Она может быть очень незаметной, вместо английской буквы случайно ввели русскую, вместо верхнего регистра использовали нижний или забыли вывести запятую. Другие случаи сложнее. Возможно ваше решение работает для одного набора входных данных, но не работает для другого. Поэтому всегда внимательно читайте условие задачи и вывод тестов. Там почти наверняка есть указание на ошибку.

Однако, если вы уверены в ошибке или нашли какую-то неточность, то вы всегда можете указать на нее. В конце каждой теории есть ссылка на содержимое урока на гитхабе (этот проект полностью открытый!). Перейдя туда, вы можете написать issue, посмотреть содержимое тестов (там видно, как вызывается ваш код) и даже отправить pullrequest. Если для вас это пока темный лес, то подключитесь в наше сообщество, там в канале _#hexlet-feedback_ мы всегда поможем.

instructions: |
Просто тренировка. Выведите на экран число 420262531.
<pre class='hexlet-basics-output'>
420262531
</pre>
Поэкспериментируйте с выводом. Передайте туда другое число или строку. Посмотрите на ответ системы, попробуйте его перевести и понять.
definitions:
- name: Тесты
description: |
специальный код, проверяющий программы на корректность, сверяя правильный результат с реальным.
tips:
- |
[TDD](https://ru.wikipedia.org/wiki/Разработка_через_тестирование)
- |
[Сообщество Хекслета в Слаке](https://help.hexlet.io/ru/articles/111445-soobshchestvo-kheksleta-v-slake)