Finished implementing the stack stack

This commit is contained in:
Julien Dessaux 2021-09-22 23:34:59 +02:00
parent 21cbac6769
commit ea72b9dbb2
2 changed files with 195 additions and 0 deletions

View file

@ -43,3 +43,49 @@ func (ss *StackStack) Begin(p *pointer.Pointer) {
soss.Push(y) soss.Push(y)
p.CalculateNewStorageOffset() p.CalculateNewStorageOffset()
} }
func (ss *StackStack) End(p *pointer.Pointer) (reflect bool) {
if ss.height == 1 {
return true
}
soss := ss.head.next
n := ss.head.Pop()
y := soss.Pop()
x := soss.Pop()
p.SetStorageOffset(x, y)
if n > 0 {
soss.height += n
if soss.size < soss.height {
soss.data = append(soss.data, make([]int, soss.height-soss.size)...)
soss.size = soss.height
}
for i := n; i > 0; i-- {
soss.data[soss.height-i] = ss.head.data[ss.head.height-i]
}
} else {
soss.height += n
if soss.height < 0 {
soss.height = 0
}
}
ss.height--
ss.head = ss.head.next
return false
}
func (ss *StackStack) Under() (reflect bool) {
if ss.height == 1 {
return true
}
n := ss.head.Pop()
if n > 0 {
for i := 0; i < n; i++ {
ss.head.Push(ss.head.next.Pop())
}
} else {
for i := 0; i < -n; i++ {
ss.head.next.Push(ss.head.Pop())
}
}
return false
}

View file

@ -100,3 +100,152 @@ func TestBegin(t *testing.T) {
require.Equal(t, expected, ss) require.Equal(t, expected, ss)
}) })
} }
func TestEnd(t *testing.T) {
t.Run("empty", func(t *testing.T) {
expected := NewStackStack()
p := pointer.NewPointer()
ss := NewStackStack()
ss.Begin(p)
reflect := ss.End(p)
require.Equal(t, false, reflect)
require.Equal(t, expected, ss)
})
t.Run("drop", func(t *testing.T) {
expected := NewStackStack()
expected.head.Push(7)
expected.head.Push(12)
expected.head.Push(14)
expected.head.Push(-2)
expected.head.Push(5)
expected.head.Pop()
expected.head.Pop()
expected.head.Pop()
p := pointer.NewPointer()
ss := NewStackStack()
ss.head.Push(7)
ss.head.Push(12)
ss.head.Push(14)
ss.head.Push(-2)
ss.head.Push(5)
ss.head.Push(0)
ss.Begin(p)
ss.head.Push(18)
ss.head.Push(42)
ss.head.Push(-3)
reflect := ss.End(p)
require.Equal(t, false, reflect)
require.Equal(t, expected, ss)
})
t.Run("drop too much", func(t *testing.T) {
expected := NewStackStack()
p := pointer.NewPointer()
ss := NewStackStack()
ss.Begin(p)
ss.head.Push(-3)
reflect := ss.End(p)
require.Equal(t, false, reflect)
require.Equal(t, expected, ss)
})
t.Run("reflect", func(t *testing.T) {
expected := NewStackStack()
p := pointer.NewPointer()
ss := NewStackStack()
reflect := ss.End(p)
require.Equal(t, true, reflect)
require.Equal(t, expected, ss)
})
t.Run("transfert", func(t *testing.T) {
expected := NewStackStack()
expected.head.size = 5
expected.head.data = make([]int, 5)
expected.head.Push(7)
expected.head.Push(12)
expected.head.Push(14)
expected.head.Push(-2)
expected.head.Push(5)
p := pointer.NewPointer()
ss := NewStackStack()
ss.head.size = 4
ss.head.data = make([]int, 4)
ss.head.Push(7)
ss.head.Push(0)
ss.Begin(p)
ss.head.Push(0)
ss.head.Push(18)
ss.head.Push(42)
ss.head.Push(7)
ss.head.Push(12)
ss.head.Push(14)
ss.head.Push(-2)
ss.head.Push(5)
ss.head.Push(4)
reflect := ss.End(p)
require.Equal(t, false, reflect)
require.Equal(t, expected, ss)
})
}
func TestUnder(t *testing.T) {
t.Run("empty", func(t *testing.T) {
expected := NewStackStack()
ss := NewStackStack()
reflect := ss.Under()
require.Equal(t, true, reflect)
require.Equal(t, expected, ss)
})
t.Run("positive", func(t *testing.T) {
pe := pointer.NewPointer()
expected := NewStackStack()
expected.head.Push(1)
expected.head.Push(2)
expected.head.Push(3)
expected.head.Push(6)
expected.head.Push(0)
expected.Begin(pe)
expected.head.Push(0)
expected.head.Push(0)
expected.head.Push(6)
expected.head.next.Pop()
expected.head.next.Pop()
expected.head.next.Pop()
p := pointer.NewPointer()
ss := NewStackStack()
ss.head.Push(1)
ss.head.Push(2)
ss.head.Push(3)
ss.head.Push(6)
ss.head.Push(0)
ss.Begin(p)
ss.head.Push(3)
reflect := ss.Under()
require.Equal(t, false, reflect)
require.Equal(t, expected, ss)
})
t.Run("negative", func(t *testing.T) {
pe := pointer.NewPointer()
expected := NewStackStack()
expected.Begin(pe)
expected.head.next.Push(12)
expected.head.next.Push(5)
expected.head.next.Push(8)
expected.head.Push(8)
expected.head.Push(5)
expected.head.Push(12)
expected.head.Push(-3)
expected.head.Pop()
expected.head.Pop()
expected.head.Pop()
expected.head.Pop()
p := pointer.NewPointer()
ss := NewStackStack()
ss.Begin(p)
ss.head.Push(8)
ss.head.Push(5)
ss.head.Push(12)
ss.head.Push(-3)
reflect := ss.Under()
require.Equal(t, false, reflect)
require.Equal(t, expected, ss)
})
}