diff options
author | Philip Paquette <pcpaquette@gmail.com> | 2018-09-26 07:48:55 -0400 |
---|---|---|
committer | Philip Paquette <pcpaquette@gmail.com> | 2019-04-18 11:14:24 -0400 |
commit | 6187faf20384b0c5a4966343b2d4ca47f8b11e45 (patch) | |
tree | 151ccd21aea20180432c13fe4b58240d3d9e98b6 /diplomacy/utils/tests/test_jsonable_changes.py | |
parent | 96b7e2c03ed98705754f13ae8efa808b948ee3a8 (diff) |
Release v1.0.0 - Diplomacy Game Engine - AGPL v3+ License
Diffstat (limited to 'diplomacy/utils/tests/test_jsonable_changes.py')
-rw-r--r-- | diplomacy/utils/tests/test_jsonable_changes.py | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/diplomacy/utils/tests/test_jsonable_changes.py b/diplomacy/utils/tests/test_jsonable_changes.py new file mode 100644 index 0000000..992a8fb --- /dev/null +++ b/diplomacy/utils/tests/test_jsonable_changes.py @@ -0,0 +1,189 @@ +# ============================================================================== +# Copyright (C) 2019 - Philip Paquette, Steven Bocco +# +# This program is free software: you can redistribute it and/or modify it under +# the terms of the GNU Affero General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your option) any +# later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +# details. +# +# You should have received a copy of the GNU Affero General Public License along +# with this program. If not, see <https://www.gnu.org/licenses/>. +# ============================================================================== +""" Test changes in a Jsonable schema. """ +#pylint: disable=invalid-name +from diplomacy.utils import parsing +from diplomacy.utils.jsonable import Jsonable + +def converter_to_int(val): + """ A converter from given value to an integer. Used in Version1. """ + try: + return int(val) + except ValueError: + return 0 + +class Version1(Jsonable): + """ A Jsonable with fields a, b, c, d. + NB: To parse a dict from Version22 to Version1, modified fields a and c must be convertible in Version1. + using ConverterType in Version1. + """ + model = { + 'a': parsing.ConverterType(int, converter_to_int), + 'b': parsing.OptionalValueType(str), + 'c': parsing.ConverterType(float, converter_function=float), + 'd': parsing.DefaultValueType(bool, True), + } + + def __init__(self, **kwargs): + self.a = None + self.b = None + self.c = None + self.d = None + super(Version1, self).__init__(**kwargs) + +class Version20(Jsonable): + """ Version1 with removed fields b and d. + NB: To parse a dict from Version20 to Version1, removed fields b and d must be optional in Version1. + """ + model = { + 'a': int, + 'c': float, + } + + def __init__(self, **kwargs): + self.a = None + self.c = None + super(Version20, self).__init__(**kwargs) + +class Version21(Jsonable): + """ Version1 with added fields e and f. + NB: To parse a dict from Version1 to Version21, added fields e and f must be optional in Version21. + """ + model = { + 'a': int, + 'b': str, + 'c': float, + 'd': bool, + 'e': parsing.DefaultValueType(parsing.EnumerationType([100, 200, 300, 400]), 100), + 'f': parsing.DefaultValueType(dict, {'x': 1, 'y': 2}) + } + + def __init__(self, **kwargs): + self.a = None + self.b = None + self.c = None + self.d = None + self.e = None + self.f = {} + super(Version21, self).__init__(**kwargs) + +class Version22(Jsonable): + """ Version1 with modified types for a and c. + NB: To parse a dict from Version1 to Version22, modified fields a and c must be convertible + using ConverterType in Version22. + """ + model = { + 'a': parsing.ConverterType(str, converter_function=str), + 'b': str, + 'c': parsing.ConverterType(bool, converter_function=bool), + 'd': bool, + } + + def __init__(self, **kwargs): + self.a = None + self.b = None + self.c = None + self.d = None + super(Version22, self).__init__(**kwargs) + +class Version3(Jsonable): + """ Version 1 with a modified, b removed, e added. + To parse a dict between Version3 and Version1: + - a must be convertible in both versions. + - b must be optional in Version1. + - e must be optional in Version3. + """ + model = { + 'a': parsing.ConverterType(str, converter_function=str), + 'c': float, + 'd': bool, + 'e': parsing.OptionalValueType(parsing.SequenceType(int)) + } + + def __init__(self, **kwargs): + self.a = None + self.c = None + self.d = None + self.e = None + super(Version3, self).__init__(**kwargs) + +def test_jsonable_changes_v1_v20(): + """ Test changes from Version1 to Version20. """ + v20 = Version20(a=1, c=1.5) + v1 = Version1(a=1, b='b', c=1.5, d=False) + json_v1 = v1.to_dict() + v20_from_v1 = Version20.from_dict(json_v1) + json_v20_from_v1 = v20_from_v1.to_dict() + v1_from_v20_from_v1 = Version1.from_dict(json_v20_from_v1) + assert v1_from_v20_from_v1.b is None + assert v1_from_v20_from_v1.d is True + json_v20 = v20.to_dict() + v1_from_v20 = Version1.from_dict(json_v20) + assert v1_from_v20.b is None + assert v1_from_v20.d is True + +def test_jsonable_changes_v1_v21(): + """ Test changes from Version1 to Version21. """ + v21 = Version21(a=1, b='b21', c=1.5, d=True, e=300, f=dict(x=1, y=2)) + v1 = Version1(a=1, b='b', c=1.5, d=False) + json_v1 = v1.to_dict() + v21_from_v1 = Version21.from_dict(json_v1) + assert v21_from_v1.e == 100 + assert v21_from_v1.f['x'] == 1 + assert v21_from_v1.f['y'] == 2 + json_v21_from_v1 = v21_from_v1.to_dict() + v1_from_v21_from_v1 = Version1.from_dict(json_v21_from_v1) + assert v1_from_v21_from_v1.b == 'b' + assert v1_from_v21_from_v1.d is False + json_v21 = v21.to_dict() + v1_from_v21 = Version1.from_dict(json_v21) + assert v1_from_v21.b == 'b21' + assert v1_from_v21.d is True + +def test_jsonable_changes_v1_v22(): + """ Test changes from Version1 to Version22. """ + v22 = Version22(a='a', b='b', c=False, d=False) + v1 = Version1(a=1, b='b', c=1.5, d=False) + json_v1 = v1.to_dict() + v22_from_v1 = Version22.from_dict(json_v1) + assert v22_from_v1.a == '1' + assert v22_from_v1.c is True + json_v22_from_v1 = v22_from_v1.to_dict() + v1_from_v22_from_v1 = Version1.from_dict(json_v22_from_v1) + assert v1_from_v22_from_v1.a == 1 + assert v1_from_v22_from_v1.c == 1.0 + json_v22 = v22.to_dict() + v1_from_v22 = Version1.from_dict(json_v22) + assert v1_from_v22.a == 0 + assert v1_from_v22.c == 0.0 + +def test_jsonable_changes_v1_v3(): + """ Test changes from Version1 to Version3. """ + v3 = Version3(a='a', c=1.5, d=False, e=(1, 2, 3)) + v1 = Version1(a=1, b='b', c=1.5, d=False) + json_v1 = v1.to_dict() + v3_from_v1 = Version3.from_dict(json_v1) + assert v3_from_v1.a == '1' + assert v3_from_v1.e is None + json_v3_from_v1 = v3_from_v1.to_dict() + v1_from_v3_from_v1 = Version1.from_dict(json_v3_from_v1) + assert v1_from_v3_from_v1.a == 1 + assert v1_from_v3_from_v1.b is None + json_v3 = v3.to_dict() + v1_from_v3 = Version1.from_dict(json_v3) + assert v1_from_v3.a == 0 + assert v1_from_v3.b is None |