Add FEN validation to pyffish (#87)
authorFabian Fichter <ianfab@users.noreply.github.com>
Fri, 30 Oct 2020 23:10:38 +0000 (00:10 +0100)
committerFabian Fichter <ianfab@users.noreply.github.com>
Fri, 30 Oct 2020 23:10:38 +0000 (00:10 +0100)
src/pyffish.cpp
test.py

index 6e33557..4805466 100644 (file)
@@ -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 (file)
--- 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)