From e21ca24d9deda942d0f29e63c6cad0b5430722c4 Mon Sep 17 00:00:00 2001 From: Erik Rauer Date: Tue, 16 Mar 2021 21:59:02 -0500 Subject: [PATCH 1/9] Add test for `string/butlast` This adds a test for the `string/butlast` instruction --- .../push/instructions/string_spec.clj | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 test/propeller/push/instructions/string_spec.clj diff --git a/test/propeller/push/instructions/string_spec.clj b/test/propeller/push/instructions/string_spec.clj new file mode 100644 index 0000000..7f5b76d --- /dev/null +++ b/test/propeller/push/instructions/string_spec.clj @@ -0,0 +1,27 @@ +(ns propeller.push.instructions.string-spec + (:require + [clojure.test.check.generators :as gen] + [clojure.test.check.properties :as prop] + [clojure.test.check.clojure-test :as ct :refer [defspec]] + [propeller.push.state :as state] + [propeller.push.core :as core] + [propeller.push.instructions.string :as string])) + + +;; string/butlast + +(defn check-butlast + [value] + (let [start-state (state/push-to-stack state/empty-state + :string + value) + end-state ((:string_butlast @core/instruction-table) start-state) + expected-result (apply str (butlast value))] + (= expected-result + (state/peek-stack end-state :string)))) + +(defspec butlast-spec 100 + (prop/for-all [s gen/string] + (check-butlast s))) + + From d73b7c6117c3eabf4bdaf0dfcf3cab113f979943 Mon Sep 17 00:00:00 2001 From: Erik Rauer Date: Tue, 16 Mar 2021 22:18:37 -0500 Subject: [PATCH 2/9] Add test for `string/concat` This adds a test for the `string/concat` instruction --- test/propeller/push/instructions/string_spec.clj | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/propeller/push/instructions/string_spec.clj b/test/propeller/push/instructions/string_spec.clj index 7f5b76d..dd4c803 100644 --- a/test/propeller/push/instructions/string_spec.clj +++ b/test/propeller/push/instructions/string_spec.clj @@ -25,3 +25,19 @@ (check-butlast s))) +;; string/concat + +(defn check-concat + [value1 value2] + (let [start-state (-> state/empty-state + (state/push-to-stack :string value1) + (state/push-to-stack :string value2)) + end-state ((:string_concat @core/instruction-table) start-state) + expected-result (str value1 value2)] + (= expected-result + (state/peek-stack end-state :string)))) + +(defspec concat-spec 100 + (prop/for-all [s1 gen/string + s2 gen/string] + (check-concat s1 s2))) \ No newline at end of file From f028b7005d3b60cf7c2483142fb9890ec8efc8cf Mon Sep 17 00:00:00 2001 From: Erik Rauer Date: Tue, 16 Mar 2021 22:27:20 -0500 Subject: [PATCH 3/9] Add test for `string/conj-char` This adds a test for the `string/conj-char` instruction --- .../push/instructions/string_spec.clj | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/test/propeller/push/instructions/string_spec.clj b/test/propeller/push/instructions/string_spec.clj index dd4c803..8b4dc61 100644 --- a/test/propeller/push/instructions/string_spec.clj +++ b/test/propeller/push/instructions/string_spec.clj @@ -40,4 +40,22 @@ (defspec concat-spec 100 (prop/for-all [s1 gen/string s2 gen/string] - (check-concat s1 s2))) \ No newline at end of file + (check-concat s1 s2))) + + +;; string/conj-char + +(defn check-conj-char + [value char] + (let [start-state (-> state/empty-state + (state/push-to-stack :string value) + (state/push-to-stack :char char)) + end-state ((:string_concat @core/instruction-table) start-state) + expected-result (str value char)] + (= expected-result + (state/peek-stack end-state :string)))) + +(defspec conj-char-spec 100 + (prop/for-all [str gen/string + char gen/char] + (check-concat str char))) \ No newline at end of file From 227a41b3762703c1fb5110bda9a1113c69f164c8 Mon Sep 17 00:00:00 2001 From: Erik Rauer Date: Tue, 16 Mar 2021 22:43:59 -0500 Subject: [PATCH 4/9] Add test for `string/contains` This adds a test for the `string/contains` instruction --- .../push/instructions/string_spec.clj | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/test/propeller/push/instructions/string_spec.clj b/test/propeller/push/instructions/string_spec.clj index 8b4dc61..10700a4 100644 --- a/test/propeller/push/instructions/string_spec.clj +++ b/test/propeller/push/instructions/string_spec.clj @@ -58,4 +58,22 @@ (defspec conj-char-spec 100 (prop/for-all [str gen/string char gen/char] - (check-concat str char))) \ No newline at end of file + (check-concat str char))) + + +;; string/contains + +(defn check-contains + [value1 value2] + (let [start-state (-> state/empty-state + (state/push-to-stack :string value1) + (state/push-to-stack :string value2)) + end-state ((:string_contains @core/instruction-table) start-state) + expected-result (string/includes? value2 value1)] + (= expected-result + (state/peek-stack end-state :boolean)))) + +(defspec contains-spec 100 + (prop/for-all [str1 gen/string + str2 gen/string] + (check-contains str1 str2))) \ No newline at end of file From ca311c9f36499c811964be6d6fb0be749c1013a0 Mon Sep 17 00:00:00 2001 From: Erik Rauer Date: Tue, 16 Mar 2021 22:47:41 -0500 Subject: [PATCH 5/9] Fix `string/contains` This fixes `string/contains` to be consistent with it's descriptions, as well as it's implementation in Clojush --- src/propeller/push/instructions/string.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/propeller/push/instructions/string.cljc b/src/propeller/push/instructions/string.cljc index 7d88e03..445373b 100755 --- a/src/propeller/push/instructions/string.cljc +++ b/src/propeller/push/instructions/string.cljc @@ -38,7 +38,7 @@ :string_contains ^{:stacks #{:boolean :string}} (fn [state] - (make-instruction state string/includes? [:string :string] :boolean))) + (make-instruction state #(string/includes? %2 %1) [:string :string] :boolean))) ;; Pushes TRUE if the top CHAR is contained in the top STRING, and FALSE ;; otherwise From 54e09010405cece33864c8225f0b675c012d0408 Mon Sep 17 00:00:00 2001 From: Erik Rauer Date: Tue, 16 Mar 2021 22:49:49 -0500 Subject: [PATCH 6/9] Change naming of some variables and fix `string/conj-char` This fixes `string/conj-char` to actually run the correct instruction instead of `string/concat`. Additionally, changes the name of some variables. --- test/propeller/push/instructions/string_spec.clj | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/test/propeller/push/instructions/string_spec.clj b/test/propeller/push/instructions/string_spec.clj index 10700a4..a10936c 100644 --- a/test/propeller/push/instructions/string_spec.clj +++ b/test/propeller/push/instructions/string_spec.clj @@ -1,11 +1,12 @@ (ns propeller.push.instructions.string-spec (:require + [clojure.string :as string] [clojure.test.check.generators :as gen] [clojure.test.check.properties :as prop] [clojure.test.check.clojure-test :as ct :refer [defspec]] [propeller.push.state :as state] [propeller.push.core :as core] - [propeller.push.instructions.string :as string])) + [propeller.push.instructions.string :as string-instructions])) ;; string/butlast @@ -21,8 +22,8 @@ (state/peek-stack end-state :string)))) (defspec butlast-spec 100 - (prop/for-all [s gen/string] - (check-butlast s))) + (prop/for-all [str gen/string] + (check-butlast str))) ;; string/concat @@ -38,9 +39,9 @@ (state/peek-stack end-state :string)))) (defspec concat-spec 100 - (prop/for-all [s1 gen/string - s2 gen/string] - (check-concat s1 s2))) + (prop/for-all [str1 gen/string + str2 gen/string] + (check-concat str1 str2))) ;; string/conj-char @@ -50,7 +51,7 @@ (let [start-state (-> state/empty-state (state/push-to-stack :string value) (state/push-to-stack :char char)) - end-state ((:string_concat @core/instruction-table) start-state) + end-state ((:string_conj-char @core/instruction-table) start-state) expected-result (str value char)] (= expected-result (state/peek-stack end-state :string)))) From 54c44a49b642aed16e739c1c5f4207a69890c5ec Mon Sep 17 00:00:00 2001 From: Erik Rauer Date: Tue, 16 Mar 2021 22:54:07 -0500 Subject: [PATCH 7/9] Add test for `string/contains-char` This adds a test for the `string/contains-char` instruction --- .../push/instructions/string_spec.clj | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/test/propeller/push/instructions/string_spec.clj b/test/propeller/push/instructions/string_spec.clj index a10936c..c4a9486 100644 --- a/test/propeller/push/instructions/string_spec.clj +++ b/test/propeller/push/instructions/string_spec.clj @@ -77,4 +77,22 @@ (defspec contains-spec 100 (prop/for-all [str1 gen/string str2 gen/string] - (check-contains str1 str2))) \ No newline at end of file + (check-contains str1 str2))) + + +;; string/contains-char + +(defn check-contains-char + [value char] + (let [start-state (-> state/empty-state + (state/push-to-stack :string value) + (state/push-to-stack :char char)) + end-state ((:string_contains-char @core/instruction-table) start-state) + expected-result (string/includes? value char)] + (= expected-result + (state/peek-stack end-state :string)))) + +(defspec contains-char-spec 100 + (prop/for-all [str gen/string + char gen/string] + (check-concat str char))) \ No newline at end of file From f14d738669809d6811d3e873fe1cef398d7ea44c Mon Sep 17 00:00:00 2001 From: Erik Rauer Date: Tue, 16 Mar 2021 23:22:04 -0500 Subject: [PATCH 8/9] Fix some issues with the `string/contains-char` test Fixes the test to actually run `check-contains-char` as well as some issues with that function. Also fixes similar problems with the `string/conj-char` test. --- test/propeller/push/instructions/string_spec.clj | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/test/propeller/push/instructions/string_spec.clj b/test/propeller/push/instructions/string_spec.clj index c4a9486..493f087 100644 --- a/test/propeller/push/instructions/string_spec.clj +++ b/test/propeller/push/instructions/string_spec.clj @@ -51,7 +51,7 @@ (let [start-state (-> state/empty-state (state/push-to-stack :string value) (state/push-to-stack :char char)) - end-state ((:string_conj-char @core/instruction-table) start-state) + end-state ((:string_conj_char @core/instruction-table) start-state) expected-result (str value char)] (= expected-result (state/peek-stack end-state :string)))) @@ -59,7 +59,7 @@ (defspec conj-char-spec 100 (prop/for-all [str gen/string char gen/char] - (check-concat str char))) + (check-conj-char str char))) ;; string/contains @@ -87,9 +87,15 @@ (let [start-state (-> state/empty-state (state/push-to-stack :string value) (state/push-to-stack :char char)) - end-state ((:string_contains-char @core/instruction-table) start-state) - expected-result (string/includes? value char)] + end-state ((:string_contains_char @core/instruction-table) start-state) + expected-result (string/includes? value (str char))] (= expected-result + (state/peek-stack end-state :boolean)))) + +(defspec contains-char-spec 100 + (prop/for-all [str gen/string + char gen/char] + (check-contains-char str char))) (state/peek-stack end-state :string)))) (defspec contains-char-spec 100 From 19b67cdfecbf85ea040f5c2de5bd5a666c2b389e Mon Sep 17 00:00:00 2001 From: Erik Rauer Date: Tue, 16 Mar 2021 23:22:40 -0500 Subject: [PATCH 9/9] Add test for `string/drop` This adds a test for the `string/drop` instruction --- .../push/instructions/string_spec.clj | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/test/propeller/push/instructions/string_spec.clj b/test/propeller/push/instructions/string_spec.clj index 493f087..50ea2de 100644 --- a/test/propeller/push/instructions/string_spec.clj +++ b/test/propeller/push/instructions/string_spec.clj @@ -96,9 +96,21 @@ (prop/for-all [str gen/string char gen/char] (check-contains-char str char))) + + +;; string/drop + +(defn check-drop + [value n] + (let [start-state (-> state/empty-state + (state/push-to-stack :string value) + (state/push-to-stack :integer n)) + end-state ((:string_drop @core/instruction-table) start-state) + expected-result (apply str (drop n value))] + (= expected-result (state/peek-stack end-state :string)))) -(defspec contains-char-spec 100 +(defspec drop-spec 100 (prop/for-all [str gen/string - char gen/string] - (check-concat str char))) \ No newline at end of file + int gen/small-integer] + (check-drop str int))) \ No newline at end of file