diff --git a/project.clj b/project.clj index 116b5f3..a9445d9 100644 --- a/project.clj +++ b/project.clj @@ -6,7 +6,8 @@ :dependencies [[org.clojure/clojure "1.11.1"] [org.clojure/tools.cli "1.0.219"] [org.apache.tika/tika-core "1.28.5"] - [org.apache.tika/tika-langdetect "1.28.5"]] + [org.apache.tika/tika-langdetect "1.28.5"] + [cheshire "5.12.0"]] :main ^:skip-aot cipher-analytical-machine.core :java-source-paths ["src/main/java"] :target-path "target/%s" diff --git a/src/cipher_analytical_machine/parsers/parsers.clj b/src/cipher_analytical_machine/parsers/parsers.clj new file mode 100644 index 0000000..e0ef1dd --- /dev/null +++ b/src/cipher_analytical_machine/parsers/parsers.clj @@ -0,0 +1,9 @@ +(ns cipher-analytical-machine.parsers.parsers + (:require [cheshire.core :as cc]) + (:gen-class)) + +(defn unsigned-int? + [str] + (if (re-matches #"\d+" str) + true false)) + diff --git a/src/cipher_analytical_machine/parsers/simple_substitution.clj b/src/cipher_analytical_machine/parsers/simple_substitution.clj new file mode 100644 index 0000000..1b3ca1e --- /dev/null +++ b/src/cipher_analytical_machine/parsers/simple_substitution.clj @@ -0,0 +1,44 @@ +(ns cipher-analytical-machine.parsers.simple-substitution + (:require + [cipher-analytical-machine.ciphers.simple-substitution :as ss] + [cipher-analytical-machine.parsers.parsers :as ps] + [cheshire.core :as cc]) + (:gen-class)) + +(defn encode-key-and-substitution-table-to-json + [key substitution-table] + (-> {"key" key} + (assoc "table" substitution-table) + (cc/generate-string))) + +(defn decode-key + "Returns the first character if the string is a char. Return the number if the string is a number." + [str] + (if (ps/unsigned-int? str) + (Integer/parseInt str) + (first str))) + +(defn decode-pair + "Decode a numbers as a string and a char as a string" + [acc [key value]] + (if (ps/unsigned-int? key) + (assoc acc (decode-key key) (decode-key value)) + (assoc acc (decode-key key) value))) + +(defn decode-substitution-table + [substitution-table-map-from-json] + (reduce decode-pair {} substitution-table-map-from-json)) + +(defn decode-key-and-substitution-table-from-json + [json] + (let [data (cc/parse-string json)] + (assoc data "table" (decode-substitution-table (get data "table"))))) + +(defn generate-table-or-decode-json + "It generate the table and return map with the key and the table if the argument is a key. Else it decode the json." + [key-or-json symbols] + (if (ps/unsigned-int? key-or-json) + (-> {"key" key-or-json} + (assoc "table" (ss/generate-substitution-table symbols))) + (decode-key-and-substitution-table-from-json key-or-json))) + diff --git a/test/cipher_analytical_machine/parsers/parsers_test.clj b/test/cipher_analytical_machine/parsers/parsers_test.clj new file mode 100644 index 0000000..ab723ef --- /dev/null +++ b/test/cipher_analytical_machine/parsers/parsers_test.clj @@ -0,0 +1,15 @@ +(ns cipher-analytical-machine.parsers.parsers-test + (:require + [clojure.test :refer :all] + [cipher-analytical-machine.parsers.parsers :refer :all])) + +(deftest unsigned-int?-test + (testing "" + (are [str expected] + (= expected + (unsigned-int? str)) + "9" true + "10" true + "-10" false + "abc" false))) + diff --git a/test/cipher_analytical_machine/parsers/simple_substitution_test.clj b/test/cipher_analytical_machine/parsers/simple_substitution_test.clj new file mode 100644 index 0000000..74e5478 --- /dev/null +++ b/test/cipher_analytical_machine/parsers/simple_substitution_test.clj @@ -0,0 +1,41 @@ +(ns cipher-analytical-machine.parsers.simple-substitution-test + (:require + [clojure.test :refer :all] + [cipher-analytical-machine.parsers.simple-substitution :refer :all])) + +(deftest encode-key-and-substitution-table-to-json-test + (testing "The encoder must parse the map and create a json." + (are [key table expected-json] + (= expected-json + (encode-key-and-substitution-table-to-json key table)) + 1 {0 \a 1 \b 2 \c} "{\"key\":1,\"table\":{\"0\":\"a\",\"1\":\"b\",\"2\":\"c\"}}" + 2 {\a 0 \b 1 \c 2} "{\"key\":2,\"table\":{\"a\":0,\"b\":1,\"c\":2}}"))) + +(deftest decode-key-and-substitution-table-from-json-test + (testing "The decoder must parse the json and create a map." + (are [json expected-data] + (= expected-data + (decode-key-and-substitution-table-from-json json)) + "{\"key\":1, \"table\":{\"0\":\"a\",\"1\":\"b\",\"2\":\"c\"}}" {"key" 1 "table" {0 \a 1 \b 2 \c}} + "{\"key\":2, \"table\":{\"a\":0,\"b\":1,\"c\":2}}" {"key" 2 "table" {\a 0 \b 1 \c 2}}))) + +(deftest generate-table-or-decode-json-test + (let [symbols "abc"] + (testing "The function decodes the json." + (are [json expected-data] + (= expected-data + (generate-table-or-decode-json json symbols)) + "{\"key\":1, \"table\":{\"0\":\"a\",\"1\":\"b\",\"2\":\"c\"}}" {"key" 1 "table" {0 \a 1 \b 2 \c}} + "{\"key\":2, \"table\":{\"a\":0,\"b\":1,\"c\":2}}" {"key" 2 "table" {\a 0 \b 1 \c 2}})) + + (testing "The function generates the table, because the argument is a key." + (are [json expected-data] + (let [data (generate-table-or-decode-json json symbols)] + (and (= (get expected-data "key") + (get data "key")) + (= (keys (get expected-data "table")) + (keys (get data "table")))) + (generate-table-or-decode-json json symbols)) + "1" {"key" 1 "table" {0 \a 1 \b 2 \c}} + "2" {"key" 2 "table" {\a 0 \b 1 \c 2}})))) +