parent
79ae13aa5a
commit
5a4b88bd08
@ -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))
|
||||||
|
|
@ -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)))
|
||||||
|
|
@ -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)))
|
||||||
|
|
@ -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}}))))
|
||||||
|
|
Loading…
Reference in new issue