-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcaesar_test.go
142 lines (120 loc) · 4.34 KB
/
caesar_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package caesar
import (
"fmt"
"strings"
"testing"
)
type testVectorAlphabet struct {
Shift int
New string
Result string
}
func TestItShiftsAlphabed(t *testing.T) {
tst := []testVectorAlphabet{
{1, "ABCD", "BCDA"},
{2, "ABCD", "CDAB"},
{3, "ABCD", "DABC"},
{4, "ABCD", "ABCD"},
{-1, "ABCD", "DABC"},
{1, "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ", "БВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯА"},
{2, "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ", "ВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯАБ"},
{3, "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ", "ГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯАБВ"},
{4, "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ", "ДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯАБВГ"},
{5, "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ", "ЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯАБВГД"},
}
for _, v := range tst {
simple := New(v.New)
ret := strings.Join(simple.doShiftedAlphabed(v.Shift), "")
if ret != v.Result {
t.Errorf("error shifting alphabet %s for %v. Got %s instead of %s", v.New, v.Shift, ret, v.Result)
}
}
}
func TestFindInAlphabet(t *testing.T) {
simple := New("ABCD")
ret := simple.findInAlphabet(simple.Alphabet, "A")
if ret != 0 {
t.Errorf("error finding in alphabet %s : %s has position of %v instead of %v", strings.Join(simple.Alphabet, ""), "A", ret, 0)
}
ret = simple.findInAlphabet(simple.Alphabet, "G")
if ret != -1 {
t.Errorf("error finding in alphabet %s : %s has position of %v instead of %v", strings.Join(simple.Alphabet, ""), "G", ret, -1)
}
ret = simple.findInAlphabet(simple.Alphabet, "B")
if ret != 1 {
t.Errorf("error finding in alphabet %s : %s has position of %v instead of %v", strings.Join(simple.Alphabet, ""), "B", ret, 1)
}
}
func TestEncrypt(t *testing.T) {
simple := New("ABCDEF")
encrypted := simple.Encrypt("AA", 3)
if encrypted != "DD" {
t.Errorf("wrong encrypted string - got %s instead of DD", encrypted)
}
}
func TestDecrypt(t *testing.T) {
simple := New("ABCDEF")
decrypted := simple.Decrypt("DD", 3)
if decrypted != "AA" {
t.Errorf("wrong decrypted string - got %s instead of AA", decrypted)
}
}
type testVector struct {
Iteration uint
Decrypted string
Encrypted string
}
func TestRot13(t *testing.T) {
rot13 := NewEnglish()
if rot13.Encrypt("HELLO", 13) != "URYYB" {
t.Error("rot13 is broken")
}
}
func TestAll(t *testing.T) {
iterations := []testVector{
{0, "ИЫЛРУДХРТ", "ИЫЛРУДХРТ"},
{1, "ЗЪКПТГФПС", "ЙЬМСФЕЦСУ"},
{2, "ЖЩЙОСВУОР", "КЭНТХЁЧТФ"},
{3, "ЁШИНРБТНП", "ЛЮОУЦЖШУХ"},
{4, "ЕЧЗМПАСМО", "МЯПФЧЗЩФЦ"},
{5, "ДЦЖЛОЯРЛН", "НАРХШИЪХЧ"},
{6, "ГХЁКНЮПКМ", "ОБСЦЩЙЫЦШ"},
{7, "ВФЕЙМЭОЙЛ", "ПВТЧЪКЬЧЩ"},
{8, "БУДИЛЬНИК", "РГУШЫЛЭШЪ"},
{9, "АТГЗКЫМЗЙ", "СДФЩЬМЮЩЫ"},
}
hard := New("АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ")
for _, v := range iterations {
if v.Iteration == 0 {
continue
}
enc := hard.Encrypt("ИЫЛРУДХРТ", v.Iteration)
if enc != v.Encrypted {
t.Errorf("error encrypting got >%s< instead of >%s< for %v iteration %t", enc, v.Encrypted, uint(v.Iteration), enc == v.Encrypted)
}
dec := hard.Decrypt("ИЫЛРУДХРТ", v.Iteration)
if dec != v.Decrypted {
t.Errorf("error decrypting got >%s< instead of >%s< for %v iteration %t", dec, v.Decrypted, uint(v.Iteration), dec == v.Decrypted)
}
}
}
func TestRespectUnknownSymbols(t *testing.T) {
rot13 := NewEnglish()
if rot13.Encrypt("HELLO!", 13) != "URYYB!" {
t.Error("unknown symbols mangled")
}
}
func ExampleNewRussian() {
cryptor := NewRussian()
fmt.Println(cryptor.Decrypt("ИЫЛРУДХРТ", 8)) // => Будильник
}
func Example() {
//for rot13 algorithm
cryptor := NewEnglish()
fmt.Println(cryptor.Decrypt("URYYB", 13)) // => HELLO
fmt.Println(cryptor.Encrypt("HELLO", 13)) // => URYYB
//for Russian language
cryptorR := NewRussian()
fmt.Println(cryptorR.Decrypt("ИЫЛРУДХРТ", 8)) // => БУДИЛЬНИК
fmt.Println(cryptorR.Encrypt("БУДИЛЬНИК", 8)) // => ИЫЛРУДХРТ
}