Skip to content

Commit 8a528d2

Browse files
.
1 parent 4ce54fa commit 8a528d2

File tree

5 files changed

+73
-82
lines changed

5 files changed

+73
-82
lines changed

go.mod

+14-8
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
1-
module github.com/gokch/snum_sort
2-
3-
go 1.19
4-
5-
require (
6-
github.com/ericlagergren/decimal v0.0.0-20211103172832-aca2edc11f73
7-
github.com/google/go-cmp v0.5.9
8-
)
1+
module github.com/gokch/snum_sort
2+
3+
go 1.19
4+
5+
require (
6+
github.com/ericlagergren/decimal v0.0.0-20211103172832-aca2edc11f73
7+
github.com/stretchr/testify v1.8.1
8+
)
9+
10+
require (
11+
github.com/davecgh/go-spew v1.1.1 // indirect
12+
github.com/pmezard/go-difflib v1.0.0 // indirect
13+
gopkg.in/yaml.v3 v3.0.1 // indirect
14+
)

go.sum

+17-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,25 @@
11
github.com/apmckinlay/gsuneido v0.0.0-20190404155041-0b6cd442a18f/go.mod h1:JU2DOj5Fc6rol0yaT79Csr47QR0vONGwJtBNGRD7jmc=
22
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
3+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
5+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
36
github.com/ericlagergren/decimal v0.0.0-20211103172832-aca2edc11f73 h1:odNUt+pGupjtZyfaNIGLT/PUxT7r3fZ0Kf+QH9reIoM=
47
github.com/ericlagergren/decimal v0.0.0-20211103172832-aca2edc11f73/go.mod h1:5sruVSMrZCk0U4hwRaGD0D8wIMFVsBWQqG74jQDFg4k=
5-
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
6-
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
78
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
89
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
10+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
11+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
912
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
13+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
14+
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
15+
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
16+
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
17+
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
18+
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
19+
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
20+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
21+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
1022
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
23+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
24+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
25+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

sort/define.go

-1
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,4 @@ const (
1010

1111
DEF_headerBitMaskSign byte = 128 // 1000 0000
1212
DEF_headerBitMaskStandardLen byte = 127 // 0111 1111
13-
DEF_headerValueSignPlus byte = DEF_headerBitMaskSign
1413
)

sort/sort.go

+21-33
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,20 @@ type SnumSort struct {
1818
}
1919

2020
func (t *SnumSort) Encode() (enc []byte, err error) {
21-
// 문자열 추출
22-
var bigRaw *big.Int
21+
// get raw
2322
bigRaw, lenDecimal, isMinus := t.Snum.GetRaw()
2423
raw := bigRaw.String()
25-
if raw == "0" { // s_num 이 0일 경우 후처리
24+
if raw == "0" { // 0 일 경우 전처리
2625
lenDecimal = DEF_digitDecimalMax
2726
}
2827
lenTotal := len(raw)
2928

30-
// 헤더 제작
29+
// make header
3130
posStartDot := t.makePosStartDot(lenTotal, lenDecimal)
32-
header := t.encodeHeader(posStartDot, isMinus)
31+
header := t.encodeHeader(posStartDot)
3332

34-
// 데이터 제작
35-
dataCompress := make([]byte, 0, lenTotal) // n_len / 2 + (n_len%2!=0)?1:0
33+
// make body
34+
dataCompress := make([]byte, 0, lenTotal) // len / 2 + (len%2!=0)?1:0
3635
numOri := []byte(raw)
3736
for i := 0; i < lenTotal; i++ {
3837
b4 := numOri[i] - byte('0')
@@ -42,18 +41,18 @@ func (t *SnumSort) Encode() (enc []byte, err error) {
4241
dataCompress[i/2] += b4
4342
}
4443
}
45-
// 부호가 음수(-) 일 경우 데이터 비트 반전
44+
// if minus, reverse bit
4645
if isMinus == true {
46+
header = ^header
4747
lenData := len(dataCompress)
4848
for i := 0; i < lenData; i++ {
49-
dataCompress[i] = ^dataCompress[i] // 비트 반전
49+
dataCompress[i] = ^dataCompress[i]
5050
}
5151

52-
// 음수의 경우 무조건 끝에 역정렬 알고리즘을 위한 비교마감(cut) 수치 0xFF 를 넣는다.
53-
dataCompress = append(dataCompress, 0xFF)
52+
dataCompress = append(dataCompress, 0xFF) // append last 0xFF
5453
}
5554

56-
// 헤더와 데이터를 합쳐 bt_ret 제작
55+
// make enc
5756
enc = make([]byte, 0, DEF_lenHeader+(lenTotal/2))
5857
enc = append(enc, header)
5958
enc = append(enc, dataCompress...)
@@ -65,38 +64,34 @@ func (t *SnumSort) Decode(enc []byte) (err error) {
6564
return errors.New("too short")
6665
}
6766

68-
// 헤더 정보 추출 - 부호 / 길이
67+
// Decode header info
6968
isMinus, lenHeader := t.decodeHeader(enc[0])
70-
if len(enc) == 2 && enc[1] == 0 { // _bt_num 이 0 일 경우 후처리
69+
if len(enc) == 2 && enc[1] == 0 { // 0 일 경우 후처리
7170
lenHeader = byte(DEF_digitDecimalMax)
7271
}
7372

74-
// 데이터 추출 및 big int 설정
75-
var sRaw string
7673
data := enc[1:]
77-
// 전처리 - 헤더에 따른 정보가 음수 일 경우
7874
if isMinus == true {
79-
// 마지막 0xFF 분리
80-
data = data[:len(data)-1]
81-
// 비트 반전(데이터)
82-
for i := 0; i < len(data); i++ {
75+
data = data[:len(data)-1] // separate last 0xFF
76+
for i := 0; i < len(data); i++ { // reverse bit
8377
data[i] = ^data[i]
8478
}
8579
}
8680

87-
// string 제작
81+
// make string
82+
var sRaw string
8883
for i := 0; i < len(data); i++ {
8984
high4bit := data[i] >> 4
9085
low4bit := data[i] - (high4bit << 4)
9186
sRaw += string('0' + high4bit)
9287
sRaw += string('0' + low4bit)
9388
}
9489

95-
// total, decimal len 추출
90+
// set total, decimal len
9691
lenTotal := len(sRaw)
9792
lenDecimal := t.makeLenDecimal(lenTotal, lenHeader)
9893

99-
// snum 세팅
94+
// set snum
10095
big, _ := big.NewInt(0).SetString(sRaw, 10)
10196
t.Snum.SetRaw(big, lenDecimal, isMinus)
10297
return nil
@@ -109,7 +104,6 @@ func (t *SnumSort) decodeHeader(header byte) (isMinus bool, lenStandard byte) {
109104
if header&DEF_headerBitMaskSign == 0 {
110105
// 부호(+-) 추출
111106
isMinus = true
112-
// 음수일 경우 헤더 보수처리
113107
header = ^header
114108
}
115109

@@ -131,13 +125,7 @@ func (t *SnumSort) makePosStartDot(lenTotal int, lenDecimal int) (posStartDot in
131125
return posStartDot
132126
}
133127

134-
func (t *SnumSort) encodeHeader(posStartDot int, isMinus bool) (header byte) {
135-
// 헤더 제작 - 제작시 양수로 가정하고 제작 후 -> 후 처리에서 음수를 반영
136-
header = DEF_headerValueSignPlus | byte(posStartDot)
137-
138-
// 음수의 경우 비트반전
139-
if isMinus == true {
140-
header = ^header
141-
}
128+
func (t *SnumSort) encodeHeader(posStartDot int) (header byte) {
129+
header = DEF_headerBitMaskSign | byte(posStartDot)
142130
return header
143131
}

sort/sort_test.go

+21-38
Original file line numberDiff line numberDiff line change
@@ -6,41 +6,28 @@ import (
66
"strings"
77
"testing"
88

9-
"github.com/google/go-cmp/cmp"
9+
"github.com/stretchr/testify/require"
1010
)
1111

12-
func Test_encode_decode(_t *testing.T) {
12+
// Byte_encode, Byte_decode
13+
// string -> bigint -> binary -> bigint -> string
14+
func TestSort_encode_decode(t *testing.T) {
1315
fn := func(input string, expect string) {
1416
if expect == "" {
1517
expect = input
1618
}
17-
18-
// Byte_encode, Byte_decode
19-
// string -> bigint -> binary -> bigint -> string
2019
numSort := NewSnumSort(input)
2120

2221
enc, err := numSort.Encode()
23-
if err != nil {
24-
_t.Error(err)
25-
return
26-
}
22+
require.NoError(t, err)
2723

2824
err = numSort.Decode(enc)
29-
if err != nil {
30-
_t.Error(err)
31-
return
32-
}
25+
require.NoError(t, err)
3326

3427
recovery, err := numSort.GetStr()
35-
if err != nil {
36-
_t.Error(err)
37-
return
38-
}
28+
require.NoError(t, err)
3929

40-
if expect != recovery {
41-
_t.Errorf("expect: %s, recovery: %s", expect, recovery)
42-
return
43-
}
30+
require.Equalf(t, expect, recovery, "input - %s", input)
4431
}
4532

4633
// 0
@@ -166,40 +153,36 @@ func Test_encode_decode(_t *testing.T) {
166153
}
167154
}
168155

169-
func Test_sort(_t *testing.T) {
156+
func Test_sort(t *testing.T) {
170157
type Input struct {
171-
Sn string
172-
Bt []byte
158+
snum string
159+
encode []byte
173160
}
174161

175162
oris := make([]*Input, 0, 100)
176-
checks := make([]*Input, 0, 100)
163+
sorts := make([]*Input, 0, 100)
177164

178165
input := func(snum string) {
179166
sorted := NewSnumSort(snum)
180167
bt, err := sorted.Encode()
181-
if err != nil {
182-
_t.Errorf("input - %s | err - %v", snum, err)
183-
}
168+
require.NoError(t, err)
184169

185-
data := &Input{Sn: snum, Bt: bt}
170+
data := &Input{snum: snum, encode: bt}
186171
oris = append(oris, data)
187-
checks = append(checks, data)
172+
sorts = append(sorts, data)
188173
}
189174

190-
check := func() {
175+
sort := func() {
191176
// sort checks
192-
sort.SliceStable(checks, func(i, j int) bool {
193-
cmp := bytes.Compare(checks[i].Bt, checks[j].Bt)
194-
if cmp == 1 {
177+
sort.SliceStable(sorts, func(i, j int) bool {
178+
cmp := bytes.Compare(sorts[i].encode, sorts[j].encode)
179+
if cmp < 0 {
195180
return true
196181
}
197182
return false
198183
})
199184
// cmp ori and sorts
200-
if cmp.Diff(oris, checks) != "" {
201-
_t.Errorf("err - oris != sorts\n%s", cmp.Diff(oris, checks))
202-
}
185+
require.EqualValues(t, oris, sorts)
203186
}
204187
input("-" + strings.Repeat("9", DEF_digitIntegerMax) + "." + strings.Repeat("9", DEF_digitDecimalMax)) // 음수 최소값
205188
input("-" + strings.Repeat("9", DEF_digitIntegerMax))
@@ -243,6 +226,6 @@ func Test_sort(_t *testing.T) {
243226
input(strings.Repeat("9", DEF_digitIntegerMax))
244227
input(strings.Repeat("9", DEF_digitIntegerMax) + "." + strings.Repeat("9", DEF_digitDecimalMax)) // 양수 최대값
245228

246-
check()
229+
sort()
247230
// print()
248231
}

0 commit comments

Comments
 (0)