Skip to content

Commit 8649fa9

Browse files
Ilya KaznacheevRoman Nuritdinov
Ilya Kaznacheev
authored and
Roman Nuritdinov
committed
Go interpreter syntax check (#37)
Go interpreter syntax check
1 parent f08648b commit 8649fa9

File tree

3 files changed

+66
-23
lines changed

3 files changed

+66
-23
lines changed

Go/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ and use Process() method
1616
package main
1717

1818
import (
19-
petooh "github.com/Ky6uk/PETOOH/Go/petooh"
19+
"github.com/Ky6uk/PETOOH/Go/petooh"
2020
)
2121
...
2222
err := petooh.Process(r, w)

Go/petooh/petooh.go

+23
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,25 @@ const (
1818
validRunes = "adehkKoOru"
1919
)
2020

21+
var koCommands = []string{
22+
koIncPtr,
23+
koDecPtr,
24+
koInc,
25+
koDec,
26+
koOut,
27+
koJmp,
28+
koRet,
29+
}
30+
31+
func isCMDSyntaxOK(cmd string) bool {
32+
for _, koCMD := range koCommands {
33+
if strings.HasPrefix(koCMD, cmd) {
34+
return true
35+
}
36+
}
37+
return false
38+
}
39+
2140
// Process function parses and processes source code commands
2241
//
2342
// r should contains source code
@@ -125,6 +144,10 @@ func Process(r io.Reader, w io.Writer) error {
125144
w.Write([]byte(string(cells[pointer])))
126145
}
127146
buffer = ""
147+
default:
148+
if !isCMDSyntaxOK(buffer) {
149+
return errors.New("wrong command: " + buffer)
150+
}
128151
}
129152

130153
if exit {

Go/petooh/petooh_test.go

+42-22
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,29 @@ package petooh
33
import (
44
"bytes"
55
"errors"
6+
"io"
67
"strings"
78
"testing"
89
)
910

10-
const source = `KoKoKoKoKoKoKoKoKoKo Kud-Kudah
11+
const (
12+
valDefault = `KoKoKoKoKoKoKoKoKoKo Kud-Kudah
1113
KoKoKoKoKoKoKoKo kudah kO kud-Kudah Kukarek kudah
1214
KoKoKo Kud-Kudah
1315
kOkOkOkO kudah kO kud-Kudah Ko Kukarek kudah
1416
KoKoKoKo Kud-Kudah KoKoKoKo kudah kO kud-Kudah kO Kukarek
1517
kOkOkOkOkO Kukarek Kukarek kOkOkOkOkOkOkO
1618
Kukarek`
17-
const res = "PETOOH"
19+
wrongSyntax = `Kudak`
20+
wrongPointer = `kudah`
21+
wrongPointerL = `KoKudkudahkud`
22+
wrongLevel = `kudkud`
23+
valLvl = `KudahKokudahKoKudKudah
24+
KoKoKoKoKoKoKoKoKoKoKoKoKoKoKoKoKoKoKoKo
25+
KoKoKoKoKoKoKoKoKoKoKoKoKoKoKoKoKoKoKoKo
26+
KoKoKoKoKoKoKoKoKoKoKoKoKoKoKoKoKoKoKoKo
27+
KoKoKoKoKukarekkudahkOkud`
28+
)
1829

1930
type errorReader struct {
2031
}
@@ -23,32 +34,41 @@ func (er errorReader) Read(p []byte) (n int, err error) {
2334
return 0, errors.New("test")
2435
}
2536

26-
func TestProcess(t *testing.T) {
27-
28-
r := strings.NewReader(source)
29-
37+
func processTestData(r io.Reader) (string, error) {
3038
w := bytes.NewBuffer([]byte{})
31-
3239
err := Process(r, w)
40+
return w.String(), err
41+
}
3342

34-
if w.String() != res {
35-
t.Errorf("method returns false result %s, but %s expected", w.String(), res)
36-
}
37-
38-
if err != nil {
39-
t.Errorf("failed on source code processing: %s", err)
43+
func TestProcess(t *testing.T) {
44+
for _, td := range []struct {
45+
r io.Reader
46+
exp string
47+
}{
48+
{strings.NewReader(valDefault), "PETOOH"}, //default example
49+
{strings.NewReader(valLvl), "A"}, //simple example with A
50+
} {
51+
res, err := processTestData(td.r)
52+
if res != td.exp {
53+
t.Errorf("method returns false result %s, but %s expected", res, td.exp)
54+
}
55+
if err != nil {
56+
t.Errorf("failed on valDefault code processing: %s", err)
57+
}
4058
}
41-
4259
}
4360

4461
func TestProcessEmpty(t *testing.T) {
45-
r := errorReader{}
46-
47-
w := bytes.NewBuffer([]byte{})
48-
49-
err := Process(r, w)
50-
51-
if err == nil {
52-
t.Error("should be error but no error was returned")
62+
for _, r := range []io.Reader{
63+
errorReader{},
64+
strings.NewReader(wrongSyntax), //wrong sintax example
65+
strings.NewReader(wrongPointer), //negative pointer
66+
strings.NewReader(wrongPointerL), //negative pointer on second level
67+
strings.NewReader(wrongLevel), //negative level
68+
} {
69+
_, err := processTestData(r)
70+
if err == nil {
71+
t.Error("should be error but no error was returned")
72+
}
5373
}
5474
}

0 commit comments

Comments
 (0)