Updated tests, to also test compatibility

This commit is contained in:
knoxfighter
2020-12-27 05:04:26 +01:00
parent 4b13316b45
commit 0acc2d41fd
5 changed files with 231 additions and 13 deletions

View File

@ -44,6 +44,9 @@ func SetupModPacks(t *testing.T, empty bool, emptyMods bool) {
err = modList.DownloadMod("/download/train-station-overview/5fc1b28cd3d1bb6fd86d9432", "train-station-overview_3.0.0.zip", "train-station-overview")
assert.NoError(t, err, `Error downloading Mod "train-station-overview"`)
err = modList.DownloadMod("/download/sonaxaton-infinite-resources/5dca095d440570000be0de82", "sonaxaton-infinite-resources_0.4.1.zip", "sonaxaton-infinite-resources")
assert.NoError(t, err, `Error downloading Mod "sonaxaton-infinite-resources""`)
}
}
}
@ -111,7 +114,48 @@ func TestModPackListHandler(t *testing.T) {
SetupModPacks(t, false, false)
defer CleanupModPacks(t)
expected := `[{"name":"test","mods":{"mods":[{"name":"belt-balancer","version":"3.0.0","title":"Belt Balancer","author":"knoxfighter","file_name":"belt-balancer_3.0.0.zip","factorio_version":"1.1.0.0","dependencies":null,"compatibility":true,"enabled":true},{"name":"train-station-overview","version":"3.0.0","title":"Train Station Overview","author":"knoxfighter","file_name":"train-station-overview_3.0.0.zip","factorio_version":"1.1.0.0","dependencies":null,"compatibility":true,"enabled":true}]}}]`
expected := `[
{
"name": "test",
"mods": {
"mods": [
{
"name": "belt-balancer",
"version": "3.0.0",
"title": "Belt Balancer",
"author": "knoxfighter",
"file_name": "belt-balancer_3.0.0.zip",
"factorio_version": "1.1.0.0",
"dependencies": null,
"compatibility": true,
"enabled": true
},
{
"name": "sonaxaton-infinite-resources",
"version": "0.4.1",
"title": "Infinite Resources",
"author": "sonaxaton",
"file_name": "sonaxaton-infinite-resources_0.4.1.zip",
"factorio_version": "0.17.0.0",
"dependencies": null,
"compatibility": false,
"enabled": true
},
{
"name": "train-station-overview",
"version": "3.0.0",
"title": "Train Station Overview",
"author": "knoxfighter",
"file_name": "train-station-overview_3.0.0.zip",
"factorio_version": "1.1.0.0",
"dependencies": null,
"compatibility": true,
"enabled": true
}
]
}
}
]`
CallRoute(t, method, route, route, nil, handlerFunc, http.StatusOK, expected)
})
@ -140,7 +184,48 @@ func TestModPackCreateHandler(t *testing.T) {
defer CleanupMods(t)
requestBody := strings.NewReader(`{"name": "test"}`)
expected := `[{"name":"test","mods":{"mods":[{"name":"belt-balancer","version":"3.0.0","title":"Belt Balancer","author":"knoxfighter","file_name":"belt-balancer_3.0.0.zip","factorio_version":"1.1.0.0","dependencies":null,"compatibility":true,"enabled":true},{"name":"train-station-overview","version":"3.0.0","title":"Train Station Overview","author":"knoxfighter","file_name":"train-station-overview_3.0.0.zip","factorio_version":"1.1.0.0","dependencies":null,"compatibility":true,"enabled":true}]}}]`
expected := `[
{
"name": "test",
"mods": {
"mods": [
{
"name": "belt-balancer",
"version": "3.0.0",
"title": "Belt Balancer",
"author": "knoxfighter",
"file_name": "belt-balancer_3.0.0.zip",
"factorio_version": "1.1.0.0",
"dependencies": null,
"compatibility": true,
"enabled": true
},
{
"name": "sonaxaton-infinite-resources",
"version": "0.4.1",
"title": "Infinite Resources",
"author": "sonaxaton",
"file_name": "sonaxaton-infinite-resources_0.4.1.zip",
"factorio_version": "0.17.0.0",
"dependencies": null,
"compatibility": false,
"enabled": true
},
{
"name": "train-station-overview",
"version": "3.0.0",
"title": "Train Station Overview",
"author": "knoxfighter",
"file_name": "train-station-overview_3.0.0.zip",
"factorio_version": "1.1.0.0",
"dependencies": null,
"compatibility": true,
"enabled": true
}
]
}
}
]`
CallRoute(t, method, route, route, requestBody, handlerFunc, http.StatusOK, expected)
})
@ -183,7 +268,43 @@ func TestModPackLoadHandler(t *testing.T) {
SetupMods(t, true)
defer CleanupMods(t)
expected := `{"mods":[{"name":"belt-balancer","version":"3.0.0","title":"Belt Balancer","author":"knoxfighter","file_name":"belt-balancer_3.0.0.zip","factorio_version":"1.1.0.0","dependencies":null,"compatibility":true,"enabled":true},{"name":"train-station-overview","version":"3.0.0","title":"Train Station Overview","author":"knoxfighter","file_name":"train-station-overview_3.0.0.zip","factorio_version":"1.1.0.0","dependencies":null,"compatibility":true,"enabled":true}]}`
expected := `{
"mods": [
{
"name": "belt-balancer",
"version": "3.0.0",
"title": "Belt Balancer",
"author": "knoxfighter",
"file_name": "belt-balancer_3.0.0.zip",
"factorio_version": "1.1.0.0",
"dependencies": null,
"compatibility": true,
"enabled": true
},
{
"name": "sonaxaton-infinite-resources",
"version": "0.4.1",
"title": "Infinite Resources",
"author": "sonaxaton",
"file_name": "sonaxaton-infinite-resources_0.4.1.zip",
"factorio_version": "0.17.0.0",
"dependencies": null,
"compatibility": false,
"enabled": true
},
{
"name": "train-station-overview",
"version": "3.0.0",
"title": "Train Station Overview",
"author": "knoxfighter",
"file_name": "train-station-overview_3.0.0.zip",
"factorio_version": "1.1.0.0",
"dependencies": null,
"compatibility": true,
"enabled": true
}
]
}`
CallRoute(t, method, baseRoute, route, nil, handlerFunc, http.StatusOK, expected)
@ -246,7 +367,43 @@ func TestModPackModListHandler(t *testing.T) {
SetupModPacks(t, false, false)
defer CleanupModPacks(t)
expected := `{"mods":[{"name":"belt-balancer","version":"3.0.0","title":"Belt Balancer","author":"knoxfighter","file_name":"belt-balancer_3.0.0.zip","factorio_version":"1.1.0.0","dependencies":null,"compatibility":true,"enabled":true},{"name":"train-station-overview","version":"3.0.0","title":"Train Station Overview","author":"knoxfighter","file_name":"train-station-overview_3.0.0.zip","factorio_version":"1.1.0.0","dependencies":null,"compatibility":true,"enabled":true}]}`
expected := `{
"mods": [
{
"name": "belt-balancer",
"version": "3.0.0",
"title": "Belt Balancer",
"author": "knoxfighter",
"file_name": "belt-balancer_3.0.0.zip",
"factorio_version": "1.1.0.0",
"dependencies": null,
"compatibility": true,
"enabled": true
},
{
"name": "sonaxaton-infinite-resources",
"version": "0.4.1",
"title": "Infinite Resources",
"author": "sonaxaton",
"file_name": "sonaxaton-infinite-resources_0.4.1.zip",
"factorio_version": "0.17.0.0",
"dependencies": null,
"compatibility": false,
"enabled": true
},
{
"name": "train-station-overview",
"version": "3.0.0",
"title": "Train Station Overview",
"author": "knoxfighter",
"file_name": "train-station-overview_3.0.0.zip",
"factorio_version": "1.1.0.0",
"dependencies": null,
"compatibility": true,
"enabled": true
}
]
}`
CallRoute(t, method, baseRoute, route, nil, handlerFunc, http.StatusOK, expected)
})

View File

@ -90,6 +90,11 @@ func SetupMods(t *testing.T, empty bool) {
if err != nil {
t.Fatalf(`Error downloading Mod "train-station-overview": %s`, err)
}
err = mod.DownloadMod("/download/sonaxaton-infinite-resources/5dca095d440570000be0de82", "sonaxaton-infinite-resources_0.4.1.zip", "sonaxaton-infinite-resources")
if err != nil {
t.Fatalf(`Error downloading Mod "sonaxaton-infinite-resources": %s`, err)
}
}
}
@ -167,7 +172,41 @@ func TestListInstalledModsHandler(t *testing.T) {
route := "/api/mods/list"
expected := `[{"name":"belt-balancer","version":"3.0.0","title":"Belt Balancer","author":"knoxfighter","file_name":"belt-balancer_3.0.0.zip","factorio_version":"1.1.0.0","dependencies":null,"compatibility":true,"enabled":true},{"name":"train-station-overview","version":"3.0.0","title":"Train Station Overview","author":"knoxfighter","file_name":"train-station-overview_3.0.0.zip","factorio_version":"1.1.0.0","dependencies":null,"compatibility":true,"enabled":true}]`
expected := `[
{
"name": "belt-balancer",
"version": "3.0.0",
"title": "Belt Balancer",
"author": "knoxfighter",
"file_name": "belt-balancer_3.0.0.zip",
"factorio_version": "1.1.0.0",
"dependencies": null,
"compatibility": true,
"enabled": true
},
{
"name": "sonaxaton-infinite-resources",
"version": "0.4.1",
"title": "Infinite Resources",
"author": "sonaxaton",
"file_name": "sonaxaton-infinite-resources_0.4.1.zip",
"factorio_version": "0.17.0.0",
"dependencies": null,
"compatibility": false,
"enabled": true
},
{
"name": "train-station-overview",
"version": "3.0.0",
"title": "Train Station Overview",
"author": "knoxfighter",
"file_name": "train-station-overview_3.0.0.zip",
"factorio_version": "1.1.0.0",
"dependencies": null,
"compatibility": true,
"enabled": true
}
]`
CallRoute(t, "GET", route, route, nil, ListInstalledModsHandler, http.StatusOK, expected)
}

View File

@ -111,7 +111,7 @@ func (modInfoList *ModInfoList) listInstalledMods() error {
server := GetFactorioServer()
if !base.Equals(NilVersion) {
modInfo.Compatibility = server.Version.Compare(base, op)
modInfo.Compatibility = server.Version.Compatible(base, op)
} else {
log.Println("error finding basemodDependency. Using FactorioVersion...")
modInfo.Compatibility = !server.Version.Less(modInfo.FactorioVersion)

View File

@ -76,6 +76,7 @@ type Mod struct {
CRC uint32 `json:"crc"`
}
// Mostly based on https://forums.factorio.com/viewtopic.php?f=5&t=8568&p=277892&hilit=level.dat+python#p277892
func (h *SaveHeader) ReadFrom(r io.Reader) (err error) {
var scratch [8]byte
@ -91,7 +92,7 @@ func (h *SaveHeader) ReadFrom(r io.Reader) (err error) {
atLeast016 := !h.FactorioVersion.Less(Version{0, 16, 0, 0})
if h.FactorioVersion.Greater(Version{0, 17, 0, 0}) {
if !h.FactorioVersion.Less(Version{0, 17, 0, 0}) {
//FIXME correct naming
_, err = r.Read(scratch[:1])
if err != nil {
@ -99,39 +100,46 @@ func (h *SaveHeader) ReadFrom(r io.Reader) (err error) {
}
}
// campaign, example: "transport-belt-madness
h.Campaign, err = readString(r, Version(h.FactorioVersion), false)
if err != nil {
return fmt.Errorf("read Campaign: %v", err)
}
// level name, example: "level-01"
h.Name, err = readString(r, Version(h.FactorioVersion), false)
if err != nil {
return fmt.Errorf("read Name: %v", err)
}
// name of the base mod, example: "base"
h.BaseMod, err = readString(r, Version(h.FactorioVersion), false)
if err != nil {
return fmt.Errorf("read BaseMod: %v", err)
}
// Read Difficulty
_, err = r.Read(scratch[:1])
if err != nil {
return fmt.Errorf("read Difficulty: %v", err)
}
h.Difficulty = scratch[0]
// Read finished as bool
_, err = r.Read(scratch[:1])
if err != nil {
return fmt.Errorf("read Finished: %v", err)
}
h.Finished = scratch[0] != 0
// Read playerWon as bool
_, err = r.Read(scratch[:1])
if err != nil {
return fmt.Errorf("read PlayerWon: %v", err)
}
h.PlayerWon = scratch[0] != 0
// Read NextLevel string (normally empty)
h.NextLevel, err = readString(r, Version(h.FactorioVersion), false)
if err != nil {
return fmt.Errorf("read NextLevel: %v", err)
@ -257,6 +265,7 @@ func readOptimUint(r io.Reader, v Version, bitSize int) (uint32, error) {
func readString(r io.Reader, game Version, forceOptimized bool) (s string, err error) {
var n uint32
// since 0.16 read optimized uint
if !game.Less(Version{0, 16, 0, 0}) || forceOptimized {
n, err = readOptimUint(r, game, 32)
if err != nil {

View File

@ -42,7 +42,13 @@ func (v Version) Equals(b Version) bool {
return v[0] == b[0] && v[1] == b[1] && v[2] == b[2] && v[3] == b[3]
}
/**
* Greater cannot be !Less, cause incompatibility is given, when changing super-major or major version.
* So this will give incompatibilities between two different versions.
*/
// Less returns true if the receiver version is less than the argument version
// This has to be kept like it is, it used to determine the versions for the binary level.dat
func (v Version) Less(b Version) bool {
switch {
case v[0] < b[0]:
@ -61,23 +67,30 @@ func (v Version) Less(b Version) bool {
// Greater returns true if the receiver version is greater than the argument version
func (v Version) Greater(b Version) bool { return !v.Equals(b) && !v.Less(b) }
func (v Version) ge(b Version) bool { return v.Equals(b) || v.Greater(b) }
func (v Version) le(b Version) bool { return v.Equals(b) || v.Less(b) }
// GreaterC called to determine the compatibility with a greater version
// Versions, that have different super/major version are not compatible!
func (v *Version) GreaterC(b Version) bool {
return v[0] == b[0] && v[1] == b[1] && (v[2] > b[2] || (v[2] == b[2] && v[3] > b[3]))
}
// Compare returns true if the comparison between the two version operands is valid.
func (v Version) ge(b Version) bool { return v.Equals(b) || v.Greater(b) }
func (v Version) geC(b Version) bool { return v.Equals(b) || v.GreaterC(b) }
func (v Version) le(b Version) bool { return v.Equals(b) || v.Less(b) }
// Compatible returns true if the comparison between the two version operands is valid.
// Supported ops are: ==, !=, >, <, >=, <=
func (v Version) Compare(b Version, op string) bool {
func (v Version) Compatible(b Version, op string) bool {
switch op {
case "==":
return v.Equals(b)
case "!=":
return !v.Equals(b)
case ">":
return v.Greater(b)
return v.GreaterC(b)
case "<":
return v.Less(b)
case ">=":
return v.ge(b)
return v.geC(b)
case "<=":
return v.le(b)
default: