Factorio: improve error message for config validation (#4421)
This commit is contained in:
parent
4c734b467f
commit
0f1c119c76
|
@ -3,13 +3,23 @@ from __future__ import annotations
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
import typing
|
import typing
|
||||||
|
|
||||||
from schema import Schema, Optional, And, Or
|
from schema import Schema, Optional, And, Or, SchemaError
|
||||||
|
|
||||||
from Options import Choice, OptionDict, OptionSet, DefaultOnToggle, Range, DeathLink, Toggle, \
|
from Options import Choice, OptionDict, OptionSet, DefaultOnToggle, Range, DeathLink, Toggle, \
|
||||||
StartInventoryPool, PerGameCommonOptions, OptionGroup
|
StartInventoryPool, PerGameCommonOptions, OptionGroup
|
||||||
|
|
||||||
# schema helpers
|
# schema helpers
|
||||||
FloatRange = lambda low, high: And(Or(int, float), lambda f: low <= f <= high)
|
class FloatRange:
|
||||||
|
def __init__(self, low, high):
|
||||||
|
self._low = low
|
||||||
|
self._high = high
|
||||||
|
|
||||||
|
def validate(self, value):
|
||||||
|
if not isinstance(value, (float, int)):
|
||||||
|
raise SchemaError(f"should be instance of float or int, but was {value!r}")
|
||||||
|
if not self._low <= value <= self._high:
|
||||||
|
raise SchemaError(f"{value} is not between {self._low} and {self._high}")
|
||||||
|
|
||||||
LuaBool = Or(bool, And(int, lambda n: n in (0, 1)))
|
LuaBool = Or(bool, And(int, lambda n: n in (0, 1)))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
"""Tests for error messages from YAML validation."""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
import WebHostLib.check
|
||||||
|
|
||||||
|
FACTORIO_YAML="""
|
||||||
|
game: Factorio
|
||||||
|
Factorio:
|
||||||
|
world_gen:
|
||||||
|
autoplace_controls:
|
||||||
|
coal:
|
||||||
|
richness: 1
|
||||||
|
frequency: {}
|
||||||
|
size: 1
|
||||||
|
"""
|
||||||
|
|
||||||
|
def yamlWithFrequency(f):
|
||||||
|
return FACTORIO_YAML.format(f)
|
||||||
|
|
||||||
|
|
||||||
|
class TestFileValidation(unittest.TestCase):
|
||||||
|
def test_out_of_range(self):
|
||||||
|
results, _ = WebHostLib.check.roll_options({"bob.yaml": yamlWithFrequency(1000)})
|
||||||
|
self.assertIn("between 0 and 6", results["bob.yaml"])
|
||||||
|
|
||||||
|
def test_bad_non_numeric(self):
|
||||||
|
results, _ = WebHostLib.check.roll_options({"bob.yaml": yamlWithFrequency("not numeric")})
|
||||||
|
self.assertIn("float", results["bob.yaml"])
|
||||||
|
self.assertIn("int", results["bob.yaml"])
|
||||||
|
|
||||||
|
def test_good_float(self):
|
||||||
|
results, _ = WebHostLib.check.roll_options({"bob.yaml": yamlWithFrequency(1.0)})
|
||||||
|
self.assertIs(results["bob.yaml"], True)
|
||||||
|
|
||||||
|
def test_good_int(self):
|
||||||
|
results, _ = WebHostLib.check.roll_options({"bob.yaml": yamlWithFrequency(1)})
|
||||||
|
self.assertIs(results["bob.yaml"], True)
|
Loading…
Reference in New Issue