package document_test
import (
"testing"
"github.com/rs/zerolog"
)
func TestSoak(t *testing.T) {
if soak == 0 {
t.Skip("-soak flag not provided or 0, so skipping.")
}
setGlobalLogLevel(zerolog.TraceLevel)
soaker := &soaker{
documentTester: newDocumentTester(t, seed, plainManagerSpawnFun),
}
soaker.documentName = soaker.randomWord(false)
defer soaker.close()
soaker.run()
}
type soaker struct {
*documentTester
documentName string
mutator *mutatingClient
listener *listeningClient
}
func (self *soaker) run() {
self.boot()
for event := uint(0); event < soak; event++ {
log := self.log.With().Uint("event", event).Logger()
self.performRandomAction(log)
}
}
func (self *soaker) boot() {
self.log.Trace().Msg("booting")
self.is.True(self.mutator == nil)
self.is.True(self.listener == nil)
self.spawnDocument(self.documentName)
self.mutator = self.newMutatingClientWithEmptyRoot()
self.listener = self.newListeningClient()
self.validateExpected()
}
func (self *soaker) performRandomAction(log zerolog.Logger) {
n := self.rng.Intn(10)
switch true {
case n == 0:
log.Trace().Msg("restarting document")
self.closeDocument()
self.spawnDocument(self.documentName)
self.mutator.documentClient = self.documentClientFactory.NewClient()
self.listener = self.newListeningClient()
self.validateExpected()
return
case n <= 2 && self.mutator.canUndo():
log.Trace().Msg("undo")
self.mutator.sendUndo()
self.validateExpected()
return
case n <= 4 && self.mutator.canRedo():
log.Trace().Msg("redo")
self.mutator.sendRedo()
self.validateExpected()
return
default:
log.Trace().Msg("mutating words")
for mutations := self.rng.Intn(5); mutations >= 0; mutations-- {
action := self.rng.Intn(5)
switch {
case action == 0:
self.mutator.unsentGeneration.addWord()
case action == 1 && len(self.mutator.unsentGeneration.orderedWords) > 1:
self.mutator.unsentGeneration.deleteWord()
default:
self.mutator.unsentGeneration.editExistingWord()
}
}
self.mutator.unsentGeneration.send()
self.validateExpected()
return
}
}
func (self *soaker) validateExpected() {
rendering, ok := self.listener.nextDocumentRendering()
self.is.True(ok)
expected := self.mutator.unsentGeneration.previous.String()
self.is.Equal(expected, rendering)
}