From d0f323a6d893197d304d8abc5d62df7afb63299d Mon Sep 17 00:00:00 2001 From: Fabian Fichter Date: Sat, 31 Oct 2020 00:10:38 +0100 Subject: [PATCH] Add FEN validation to pyffish (#87) --- src/pyffish.cpp | 11 +++++++++++ test.py | 5 +++++ 2 files changed, 16 insertions(+), 0 deletions(-) diff --git a/src/pyffish.cpp b/src/pyffish.cpp index 6e33557..4805466 100644 --- a/src/pyffish.cpp +++ b/src/pyffish.cpp @@ -300,6 +300,16 @@ extern "C" PyObject* pyffish_hasInsufficientMaterial(PyObject* self, PyObject *a return Py_BuildValue("(OO)", wInsufficient ? Py_True : Py_False, bInsufficient ? Py_True : Py_False); } +// INPUT variant, fen +extern "C" PyObject* pyffish_validateFen(PyObject* self, PyObject *args) { + const char *fen, *variant; + if (!PyArg_ParseTuple(args, "ss", &fen, &variant)) { + return NULL; + } + + return Py_BuildValue("i", fen::validate_fen(std::string(fen), variants.find(std::string(variant))->second)); +} + static PyMethodDef PyFFishMethods[] = { {"version", (PyCFunction)pyffish_version, METH_NOARGS, "Get package version."}, @@ -317,6 +327,7 @@ static PyMethodDef PyFFishMethods[] = { {"is_immediate_game_end", (PyCFunction)pyffish_isImmediateGameEnd, METH_VARARGS, "Get result from given FEN if variant rules ends the game."}, {"is_optional_game_end", (PyCFunction)pyffish_isOptionalGameEnd, METH_VARARGS, "Get result from given FEN it rules enable game end by player."}, {"has_insufficient_material", (PyCFunction)pyffish_hasInsufficientMaterial, METH_VARARGS, "Checks for insufficient material."}, + {"validate_fen", (PyCFunction)pyffish_validateFen, METH_VARARGS, "Validate an input FEN."}, {NULL, NULL, 0, NULL}, // sentinel }; diff --git a/test.py b/test.py index 0f93af6..ecc793a 100644 --- a/test.py +++ b/test.py @@ -500,6 +500,11 @@ class TestPyffish(unittest.TestCase): result = sf.has_insufficient_material(variant, fen, []) self.assertEqual(result, expected_result, "{}: {}".format(variant, fen)) + def test_validate_fen(self): + for variant, positions in variant_positions.items(): + for fen in positions: + self.assertTrue(sf.validate_fen(fen, variant) == 1, "{}: {}".format(variant, fen)) + if __name__ == '__main__': unittest.main(verbosity=2) -- 1.7.0.4