Compare commits

..
5 Commits
Author SHA1 Message Date
KKlochko fcae272944 Add key validation for Caesar and Gamma ciphers.
continuous-integration/drone/push Build is passing
2023-11-01 15:07:13 +02:00
KKlochko 1e45771b3e Add key? to check if a string is a gamma key. 2023-11-01 15:05:08 +02:00
KKlochko e145382570 Add int-string? to check if a string is a number.
continuous-integration/drone/push Build is passing
2023-11-01 15:02:44 +02:00
KKlochko 91dc00ea0d Rename unsigned-int? to unsigned-int-string? 2023-11-01 15:01:22 +02:00
KKlochko 0261c97d76 Add the option for the gamma cipher.
continuous-integration/drone/push Build is passing
2023-10-31 16:50:25 +02:00
7 changed files with 69 additions and 8 deletions
+11
View File
@@ -1,5 +1,7 @@
(ns cipher-analytical-machine.cli.cli (ns cipher-analytical-machine.cli.cli
(:require (:require
[cipher-analytical-machine.parsers.parsers :as ps]
[cipher-analytical-machine.parsers.gamma :as gamma-ps]
[cipher-analytical-machine.cli.file :as file] [cipher-analytical-machine.cli.file :as file]
[cipher-analytical-machine.symbols.factories :as sf] [cipher-analytical-machine.symbols.factories :as sf]
[cipher-analytical-machine.cli.options :as options] [cipher-analytical-machine.cli.options :as options]
@@ -77,6 +79,15 @@
(or (contains? options :encrypt) (or (contains? options :encrypt)
(contains? options :decrypt))) (contains? options :decrypt)))
(cond (cond
(and (= (:cipher options) "Caesar")
(false? (ps/int-string? (:key options))))
{:exit-message (error-msg ["Please, use the key format: [+-](integer)!!! Example: 10, +9, -7."])}
(and (= (:cipher options) "Gamma")
(false? (gamma-ps/key? (:key options))))
{:exit-message (error-msg ["Please, use the key format: [+-](integer),[+-](integer),[+-](integer) !!! Example: 10,+9,-7."])}
(contains? options :encrypt) (contains? options :encrypt)
{:options options :arguments arguments :action-type :encrypt} {:options options :arguments arguments :action-type :encrypt}
@@ -22,7 +22,7 @@
(option-values-as-list option values))) (option-values-as-list option values)))
(def cipher-options (def cipher-options
#{"Caesar" "Simple substitution and Caesar"}) #{"Caesar" "Simple substitution and Caesar" "Gamma"})
(def default-cipher "Caesar") (def default-cipher "Caesar")
@@ -0,0 +1,9 @@
(ns cipher-analytical-machine.parsers.gamma
(:gen-class))
(defn key?
"Return true if the string is an key of three integers."
[str]
(if (re-matches #"[+-]?\b\d+\b,[+-]?\b\d+\b,[+-]?\b\d+\b" str)
true false))
@@ -2,12 +2,18 @@
(:require [cheshire.core :as cc]) (:require [cheshire.core :as cc])
(:gen-class)) (:gen-class))
(defn unsigned-int? (defn unsigned-int-string?
"Return true if the string is an unsigned integer." "Return true if the string is an unsigned integer."
[str] [str]
(if (re-matches #"\d+" str) (if (re-matches #"\d+" str)
true false)) true false))
(defn int-string?
"Return true if the string is an signed integer."
[str]
(if (re-matches #"[+-]?\b\d+\b" str)
true false))
(defn parse-unsigned-int (defn parse-unsigned-int
"Return an integer if the argument is an integer." "Return an integer if the argument is an integer."
[str-or-int] [str-or-int]
@@ -15,7 +21,7 @@
(int? str-or-int) (int? str-or-int)
str-or-int str-or-int
(unsigned-int? str-or-int) (unsigned-int-string? str-or-int)
(Integer/parseInt str-or-int) (Integer/parseInt str-or-int)
:else :else
@@ -15,14 +15,14 @@
(defn decode-key (defn decode-key
"Returns the first character if the string is a char. Return the number if the string is a number." "Returns the first character if the string is a char. Return the number if the string is a number."
[str] [str]
(if (ps/unsigned-int? str) (if (ps/unsigned-int-string? str)
(Integer/parseInt str) (Integer/parseInt str)
(first str))) (first str)))
(defn decode-pair (defn decode-pair
"Decode a numbers as a string and a char as a string" "Decode a numbers as a string and a char as a string"
[acc [key value]] [acc [key value]]
(if (ps/unsigned-int? key) (if (ps/unsigned-int-string? key)
(assoc acc (decode-key key) (decode-key value)) (assoc acc (decode-key key) (decode-key value))
(assoc acc (decode-key key) value))) (assoc acc (decode-key key) value)))
@@ -38,7 +38,7 @@
(defn generate-table-or-decode-json (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." "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] [key-or-json symbols]
(if (ps/unsigned-int? key-or-json) (if (ps/unsigned-int-string? key-or-json)
(-> {"key" key-or-json} (-> {"key" key-or-json}
(assoc "table" (ss/generate-substitution-table symbols))) (assoc "table" (ss/generate-substitution-table symbols)))
(decode-key-and-substitution-table-from-json key-or-json))) (decode-key-and-substitution-table-from-json key-or-json)))
@@ -0,0 +1,20 @@
(ns cipher-analytical-machine.parsers.gamma-test
(:require
[clojure.test :refer :all]
[cipher-analytical-machine.parsers.gamma :refer :all]))
(deftest key?-test
(testing "The function return true only if the key in the format '%d,%d,%d'."
(are [str expected]
(= expected
(key? str))
"9" false
"9,10" false
"10,9,8" true
"-10,9,-8" true
"-10,-9,-8" true
"asd 10 " false
" 10 " false
"-10" false
"abc" false)))
@@ -3,16 +3,31 @@
[clojure.test :refer :all] [clojure.test :refer :all]
[cipher-analytical-machine.parsers.parsers :refer :all])) [cipher-analytical-machine.parsers.parsers :refer :all]))
(deftest unsigned-int?-test (deftest unsigned-int-string?-test
(testing "The function return true only for an unsingned integer as a string." (testing "The function return true only for an unsingned integer as a string."
(are [str expected] (are [str expected]
(= expected (= expected
(unsigned-int? str)) (unsigned-int-string? str))
"9" true
"9" true "9" true
"10" true "10" true
"asd 10 " false
" 10 " false
"-10" false "-10" false
"abc" false))) "abc" false)))
(deftest int-string?-test
(testing "The function return true only for an singned integer as a string."
(are [str expected]
(= expected
(int-string? str))
"9" true
"10" true
"-10" true
"asd -10 " false
" -10 " false
"abc" false)))
(deftest parse-unsigned-int-test (deftest parse-unsigned-int-test
(testing "The function parse the integer if the string is an integer." (testing "The function parse the integer if the string is an integer."
(are [str-or-int expected] (are [str-or-int expected]