Skip to content

Commit 2fc0aac

Browse files
committed
add test for state
1 parent aa259eb commit 2fc0aac

File tree

6 files changed

+149
-23
lines changed

6 files changed

+149
-23
lines changed

main.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -123,28 +123,28 @@ func handleCommand(s tcell.Screen, commandChan chan commands.Command) {
123123

124124
func handleChange(s tcell.Screen, stateChan chan state.State) {
125125
for {
126-
state, ok := <-stateChan
126+
st, ok := <-stateChan
127127
if !ok {
128128
return
129129
}
130-
render(s, state)
130+
render(s, st)
131131
}
132132
}
133133

134134
func start(s tcell.Screen, root *entry.Dir, commandChan chan commands.Command, stateChan chan state.State) {
135135
width, height := s.Size()
136-
state := state.NewState(root, width, height-1)
137-
stateChan <- state
136+
var st state.State = state.NewState(root, width, height-1)
137+
stateChan <- st
138138

139139
for {
140140
command, ok := <-commandChan
141141
if !ok {
142142
close(stateChan)
143143
return
144144
}
145-
if nextState, err := command.Do(state); err == nil {
146-
state = nextState
147-
stateChan <- state
145+
if next, err := command.Do(st); err == nil {
146+
st = next
147+
stateChan <- st
148148
}
149149
}
150150
}

state/state.go

+12-16
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ type state struct {
2323
height int
2424
}
2525

26-
func NewState(root *entry.Dir, width, height int) State {
26+
func NewState(root *entry.Dir, width, height int) *state {
2727
return &state{
2828
root: root,
2929
pos: 0,
@@ -88,10 +88,12 @@ func (st *state) adjust() {
8888
}
8989

9090
func (st *state) View() views.CellModel {
91-
items := []*struct {
91+
type item struct {
9292
Name string
9393
Depth int
94-
}{}
94+
}
95+
96+
items := []*item{}
9597
_ = st.Root().Walk(func(e entry.Entry) error {
9698
name := e.String()
9799
if e, ok := e.(*entry.Dir); ok {
@@ -102,18 +104,12 @@ func (st *state) View() views.CellModel {
102104
}
103105
}
104106

105-
items = append(items, &struct {
106-
Name string
107-
Depth int
108-
}{
109-
Name: name,
110-
Depth: e.Depth(),
111-
})
107+
items = append(items, &item{Name: name, Depth: e.Depth()})
112108
return nil
113109
})
114110

115111
m := map[int]interface{}{}
116-
lines := []*ViewLine{}
112+
lines := []*viewLine{}
117113
for i := len(items) - 1; i >= 0; i-- {
118114
prefix := ""
119115
for j := 0; j < items[i].Depth-1; j++ {
@@ -136,7 +132,7 @@ func (st *state) View() views.CellModel {
136132
style = style.Reverse(true)
137133
}
138134

139-
lines = append([]*ViewLine{{prefix + items[i].Name, style}}, lines...)
135+
lines = append([]*viewLine{{prefix + items[i].Name, style}}, lines...)
140136
m[items[i].Depth] = struct{}{}
141137
if i < len(items)-1 {
142138
for depth := items[i].Depth + 1; depth <= items[i+1].Depth; depth++ {
@@ -153,7 +149,7 @@ func (st *state) View() views.CellModel {
153149
}
154150

155151
type viewState struct {
156-
lines []*ViewLine
152+
lines []*viewLine
157153
width int
158154
height int
159155
}
@@ -183,15 +179,15 @@ func (v *viewState) SetCursor(int, int) {}
183179

184180
func (v *viewState) MoveCursor(offx, offy int) {}
185181

186-
type ViewLine struct {
182+
type viewLine struct {
187183
text string
188184
style tcell.Style
189185
}
190186

191-
func (l *ViewLine) String() string {
187+
func (l *viewLine) String() string {
192188
return l.text
193189
}
194190

195-
func (l *ViewLine) Style() tcell.Style {
191+
func (l *viewLine) Style() tcell.Style {
196192
return l.style
197193
}

state/state_test.go

+130
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package state
2+
3+
import (
4+
"testing"
5+
6+
"github.com/shota3506/gtree/entry"
7+
"github.com/stretchr/testify/assert"
8+
"github.com/stretchr/testify/require"
9+
)
10+
11+
/*
12+
testdata
13+
├── a
14+
│   ├── b
15+
│   │   ├── sample4.txt
16+
│   │   └── sample5.txt
17+
│   ├── c
18+
│   │   └── sample6.txt
19+
│   └── sample3.txt
20+
├── sample1.txt
21+
└── sample2.txt
22+
*/
23+
24+
func TestStateUpAndDown(t *testing.T) {
25+
root, err := entry.NewRoot("testdata", false)
26+
require.NoError(t, err)
27+
28+
st := NewState(root, 100, 100)
29+
require.Equal(t, 4, st.Root().Size())
30+
require.Equal(t, 0, st.offset)
31+
require.Equal(t, 0, st.pos)
32+
33+
st.Down()
34+
assert.Equal(t, 1, st.pos)
35+
st.Down()
36+
assert.Equal(t, 2, st.pos)
37+
st.Down()
38+
assert.Equal(t, 3, st.pos)
39+
st.Down()
40+
assert.Equal(t, 3, st.pos)
41+
42+
st.Up()
43+
assert.Equal(t, 2, st.pos)
44+
st.Up()
45+
assert.Equal(t, 1, st.pos)
46+
st.Up()
47+
assert.Equal(t, 0, st.pos)
48+
st.Up()
49+
assert.Equal(t, 0, st.pos)
50+
}
51+
52+
func TestStateUpAndDownWithOffsetAdjustment(t *testing.T) {
53+
root, err := entry.NewRoot("testdata", false)
54+
require.NoError(t, err)
55+
56+
st := NewState(root, 100, 2)
57+
require.Equal(t, 4, st.Root().Size())
58+
require.Equal(t, 0, st.offset)
59+
require.Equal(t, 0, st.pos)
60+
61+
st.Down()
62+
assert.Equal(t, 1, st.pos)
63+
assert.Equal(t, 0, st.offset)
64+
st.Down()
65+
assert.Equal(t, 2, st.pos)
66+
assert.Equal(t, 1, st.offset)
67+
st.Down()
68+
assert.Equal(t, 3, st.pos)
69+
assert.Equal(t, 2, st.offset)
70+
71+
st.Up()
72+
assert.Equal(t, 2, st.pos)
73+
assert.Equal(t, 2, st.offset)
74+
st.Up()
75+
assert.Equal(t, 1, st.pos)
76+
assert.Equal(t, 1, st.offset)
77+
st.Up()
78+
assert.Equal(t, 0, st.pos)
79+
assert.Equal(t, 0, st.offset)
80+
}
81+
82+
func TestStateSetSize(t *testing.T) {
83+
root, err := entry.NewRoot("testdata", false)
84+
require.NoError(t, err)
85+
86+
st := NewState(root, 100, 200)
87+
require.Equal(t, 100, st.width)
88+
require.Equal(t, 200, st.height)
89+
90+
st.SetSize(10, 20)
91+
require.Equal(t, 10, st.width)
92+
require.Equal(t, 20, st.height)
93+
}
94+
95+
func TestStateSetSizeWithOffsetAdjustment(t *testing.T) {
96+
root, err := entry.NewRoot("testdata", false)
97+
require.NoError(t, err)
98+
99+
st := NewState(root, 100, 200)
100+
st.Down()
101+
st.Down()
102+
st.Down()
103+
104+
assert.Equal(t, 0, st.offset)
105+
st.SetSize(100, 2)
106+
assert.Equal(t, 2, st.offset)
107+
}
108+
109+
func TestStateToggle(t *testing.T) {
110+
root, err := entry.NewRoot("testdata", false)
111+
require.NoError(t, err)
112+
113+
st := NewState(root, 100, 100)
114+
require.Equal(t, 4, st.Root().Size())
115+
st.Down()
116+
require.Equal(t, 1, st.pos)
117+
118+
e, err := st.Root().Get(st.pos)
119+
require.NoError(t, err)
120+
d, ok := e.(*entry.Dir)
121+
require.True(t, ok)
122+
123+
err = st.Toggle() // open
124+
require.NoError(t, err)
125+
assert.True(t, d.IsOpen())
126+
127+
err = st.Toggle() // close
128+
require.NoError(t, err)
129+
assert.False(t, d.IsOpen())
130+
}

state/testdata/a/sample3.txt

Whitespace-only changes.

state/testdata/sample1.txt

Whitespace-only changes.

state/testdata/sample2.txt

Whitespace-only changes.

0 commit comments

Comments
 (0)