137 lines
3.9 KiB
Go
137 lines
3.9 KiB
Go
package resource_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/inkyblackness/hacked/ss1/resource"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/suite"
|
|
)
|
|
|
|
type ChangeNotifierSuite struct {
|
|
suite.Suite
|
|
|
|
lastModifiedIDs []resource.ID
|
|
lastFailedIDs []resource.ID
|
|
|
|
localizedResources resource.LocalizedResourcesList
|
|
|
|
instance resource.ChangeNotifier
|
|
}
|
|
|
|
func TestResourceChangeNotifierSuite(t *testing.T) {
|
|
suite.Run(t, new(ChangeNotifierSuite))
|
|
}
|
|
|
|
func (suite *ChangeNotifierSuite) SetupTest() {
|
|
suite.lastModifiedIDs = nil
|
|
suite.lastFailedIDs = nil
|
|
|
|
suite.instance.Localizer = suite
|
|
suite.instance.Callback = suite.onResourcesModified
|
|
}
|
|
|
|
func (suite *ChangeNotifierSuite) TestNoIDsAreNotifiedIfDataNotChanged() {
|
|
suite.givenListIsMadeOf(
|
|
suite.someLocalizedResources(resource.LangGerman,
|
|
suite.storing(0x1000, []byte{0x01})))
|
|
suite.whenResourcesAreModified(func() {}, 0x1000)
|
|
suite.thenModifiedIDsShouldBe()
|
|
}
|
|
|
|
func (suite *ChangeNotifierSuite) TestIDsAreNotifiedOfNewData() {
|
|
suite.givenListIsMadeOf(
|
|
suite.someLocalizedResources(resource.LangGerman,
|
|
suite.storing(0x1000, []byte{0x01})))
|
|
suite.whenResourcesAreModified(func() {
|
|
suite.extendingListWith(
|
|
suite.someLocalizedResources(resource.LangGerman,
|
|
suite.storing(0x2000, []byte{0x01})))
|
|
}, 0x2000)
|
|
suite.thenModifiedIDsShouldBe(0x2000)
|
|
}
|
|
|
|
func (suite *ChangeNotifierSuite) TestIDsAreNotifiedOfRemovedData() {
|
|
suite.givenListIsMadeOf(
|
|
suite.someLocalizedResources(resource.LangGerman,
|
|
suite.storing(0x1000, []byte{0x01})))
|
|
suite.whenResourcesAreModified(func() {
|
|
suite.listIsMadeOf()
|
|
}, 0x1000)
|
|
suite.thenModifiedIDsShouldBe(0x1000)
|
|
}
|
|
|
|
func (suite *ChangeNotifierSuite) TestIDsAreNotifiedOfChangedData() {
|
|
suite.givenListIsMadeOf(
|
|
suite.someLocalizedResources(resource.LangAny,
|
|
suite.storing(0x1000, []byte{0x01})))
|
|
suite.whenResourcesAreModified(func() {
|
|
suite.listIsMadeOf(
|
|
suite.someLocalizedResources(resource.LangAny,
|
|
suite.storing(0x1000, []byte{0x02})))
|
|
}, 0x1000)
|
|
suite.thenModifiedIDsShouldBe(0x1000)
|
|
}
|
|
|
|
func (suite *ChangeNotifierSuite) givenListIsMadeOf(resources ...resource.LocalizedResources) {
|
|
suite.localizedResources = resources
|
|
}
|
|
|
|
func (suite *ChangeNotifierSuite) extendingListWith(resources ...resource.LocalizedResources) {
|
|
suite.localizedResources = append(suite.localizedResources, resources...)
|
|
}
|
|
|
|
func (suite *ChangeNotifierSuite) listIsMadeOf(resources ...resource.LocalizedResources) {
|
|
suite.localizedResources = resources
|
|
}
|
|
|
|
func (suite *ChangeNotifierSuite) whenResourcesAreModified(modifier func(), affectedIDs ...int) {
|
|
convertedIDs := make([]resource.ID, len(affectedIDs))
|
|
for i, id := range affectedIDs {
|
|
convertedIDs[i] = resource.ID(id)
|
|
}
|
|
suite.instance.ModifyAndNotify(modifier, convertedIDs)
|
|
}
|
|
|
|
func (suite *ChangeNotifierSuite) thenModifiedIDsShouldBe(expected ...int) {
|
|
convertedIDs := make([]resource.ID, len(expected))
|
|
for i, id := range expected {
|
|
convertedIDs[i] = resource.ID(id)
|
|
}
|
|
|
|
assert.Equal(suite.T(), convertedIDs, suite.lastModifiedIDs, "IDs don't match")
|
|
}
|
|
|
|
func (suite *ChangeNotifierSuite) someLocalizedResources(lang resource.Language, modifiers ...func(*resource.Store)) resource.LocalizedResources {
|
|
var store resource.Store
|
|
for _, modifier := range modifiers {
|
|
modifier(&store)
|
|
}
|
|
return resource.LocalizedResources{
|
|
ID: "unnamed",
|
|
Language: lang,
|
|
Viewer: store,
|
|
}
|
|
}
|
|
|
|
func (suite *ChangeNotifierSuite) storing(id int, data ...[]byte) func(*resource.Store) {
|
|
return func(store *resource.Store) {
|
|
_ = store.Put(resource.ID(id), resource.Resource{
|
|
Blocks: resource.BlocksFrom(data),
|
|
})
|
|
}
|
|
}
|
|
|
|
func (suite *ChangeNotifierSuite) LocalizedResources(lang resource.Language) resource.Selector {
|
|
return resource.Selector{
|
|
From: suite.localizedResources,
|
|
Lang: lang,
|
|
}
|
|
}
|
|
|
|
func (suite *ChangeNotifierSuite) onResourcesModified(modifiedIDs []resource.ID, failedIDs []resource.ID) {
|
|
suite.lastModifiedIDs = modifiedIDs
|
|
suite.lastFailedIDs = failedIDs
|
|
}
|