diff --git a/assertk/src/jvmMain/kotlin/assertk/assertions/file.kt b/assertk/src/jvmMain/kotlin/assertk/assertions/file.kt index ec20ae94..a78f3eac 100644 --- a/assertk/src/jvmMain/kotlin/assertk/assertions/file.kt +++ b/assertk/src/jvmMain/kotlin/assertk/assertions/file.kt @@ -64,6 +64,12 @@ fun Assert.isFile() = given { actual -> expected("to be a file") } +/** Assert that the file is an executable. */ +fun Assert.canExecute() = given { actual -> + if (actual.canExecute()) return + expected("to be executable") +} + /** * Asserts the file is hidden. * @see [isNotHidden] diff --git a/assertk/src/jvmTest/kotlin/test/assertk/assertions/FileTest.kt b/assertk/src/jvmTest/kotlin/test/assertk/assertions/FileTest.kt index 3518c891..f5de0091 100644 --- a/assertk/src/jvmTest/kotlin/test/assertk/assertions/FileTest.kt +++ b/assertk/src/jvmTest/kotlin/test/assertk/assertions/FileTest.kt @@ -58,6 +58,23 @@ class FileTest { } //endregion + //region canExecute + @Test + fun canExecute_value_regular_file_passes() { + file.setExecutable(true) + assertThat(file).canExecute() + } + + @Test + fun canExecute_value_directory_fails() { + file.setExecutable(false) + val error = assertFailsWith { + assertThat(file).canExecute() + } + assertEquals("expected to be executable", error.message) + } + //endregion + //region isNotHidden @Test fun isNotHidden_value_regular_file_passes() { @@ -207,6 +224,13 @@ class FileTest { assertThat(fileWithText).text().contains("Forty-two") } + //region bytes + @Test + fun hasBytes_correct_value_passes() { + assertThat(fileWithText).bytes().isEqualTo(fileWithText.readBytes()) + } + //endregion + @Test fun contains_wrong_substring_fails() { val error = assertFailsWith { diff --git a/assertk/src/jvmTest/kotlin/test/assertk/assertions/PathTest.kt b/assertk/src/jvmTest/kotlin/test/assertk/assertions/PathTest.kt index 86a92368..2a6f9c3e 100644 --- a/assertk/src/jvmTest/kotlin/test/assertk/assertions/PathTest.kt +++ b/assertk/src/jvmTest/kotlin/test/assertk/assertions/PathTest.kt @@ -59,6 +59,24 @@ class PathTest { } //endregion + + //region isExecutable + @Test + fun isExecutable_value_regular_file_executable_passes() { + regularFile!!.toFile().setExecutable(true) + assertThat(regularFile!!).isExecutable() + } + + @Test + fun isExecutable_value_regular_file_not_executable_fails() { + regularFile!!.toFile().setExecutable(false) + val error = assertFailsWith { + assertThat(regularFile!!).isExecutable() + } + assertEquals("expected <$regularFile> to be an executable, but it is not", error.message) + } + //endregion + //region isHidden @Test fun isHidden_value_regular_file_not_hidden_fails() {