from pprint import pprint
from ppp_libmodule.tests import PPPTestCase
from ppp_datamodel import Resource as R
from ppp_datamodel import Triple as T
from ppp_datamodel import Missing as M

from ppp_french_parser import parser
from ppp_french_parser import app

class ParserTestCase(PPPTestCase(app)):
    config_var = 'PPP_FRENCHPARSER_CONFIG'
    config = """{
        "class_path": "stanford-postagger-full-2014-10-26/stanford-postagger.jar",
        "model": "stanford-postagger-full-2014-10-26/models/french.tagger"
    }"""
    def testBase(self):
        self.assertEqual(parser.parse('Quel est ton nom ?'),
                T(R('toi'), R('nom'), M()))
        self.assertEqual(parser.parse('Quel âge as-tu ?'),
                T(R('toi'), R('âge'), M()))
        self.assertEqual(parser.parse('Qui est président de la France ?'),
                T(R('France'), R('président'), M()))
        self.assertEqual(parser.parse('Qui est le président de la France ?'),
                T(R('France'), R('président'), M()))
        self.assertEqual(parser.parse('Quelle est la capitale de la France ?'),
                T(R('France'), R('capitale'), M()))

    def testManyComplements(self):
        self.assertEqual(parser.parse('Qui est le président des États-Unis ?'),
                T(R('États-Unis'), R('président'), M()))
        self.assertEqual(parser.parse('Qui est la femme du président des États-Unis ?'),
                T(T(R('États-Unis'), R('président'), M()), R('femme'), M()))
        self.assertEqual(parser.parse('Qui est le mari de la femme du président des États-Unis ?'),
                T(T(T(R('États-Unis'), R('président'), M()), R('femme'), M()), R('mari'), M()))
        self.assertEqual(parser.parse('Qui sont les filles de la femme du président des États-Unis ?'),
                T(T(T(R('États-Unis'), R('président'), M()), R('femme'), M()), R('filles'), M()))
        self.assertEqual(parser.parse('Qui sont les filles du mari de la femme du président des États-Unis ?'),
                T(T(T(T(R('États-Unis'), R('président'), M()), R('femme'), M()), R('mari'), M()), R('filles'), M()))

    def testApostrophe(self):
        self.assertEqual(parser.parse('Qui a écrit l\'huître ?'),
                T(R('huître'), R('auteur'), M()))
        self.assertEqual(parser.parse('Qui est l\'auteur de Le Pain ?'),
                T(R('Pain'), R('auteur'), M()))
        self.assertEqual(parser.parse('Quel est l’âge de Obama ?'),
                T(R('Obama'), R('âge'), M()))
        self.assertEqual(parser.parse('Quel est âge d’Obama ?'),
                T(R('Obama'), R('âge'), M()))
        self.assertEqual(parser.parse('Quel est l’âge d’Obama ?'),
                T(R('Obama'), R('âge'), M()))

    def testQuotes(self):
        self.assertEqual(parser.parse('Qui a écrit « Le Petit Prince » ?'),
                T(R('Le Petit Prince'), R('auteur'), M()))

    def testLocation(self):
        self.assertEqual(parser.parse('Où est la France ?'),
                T(R('France'), R('localisation'), M()))
        self.assertEqual(parser.parse('Où est la capitale de la France ?'),
                T(T(R('France'), R('capitale'), M()), R('localisation'), M()))

    def testComposedPredicates(self):
        self.assertEqual(parser.parse('Quelle est la date de naissance de Obama ?'),
                T(R('Obama'), R('date de naissance'), M()))
        self.assertEqual(parser.parse('Quelle est la date de naissance du président ?'),
                T(R('président'), R('date de naissance'), M()))
        self.assertEqual(parser.parse('Quelle est la date de naissance du président des États-Unis ?'),
                T(T(R('États-Unis'), R('président'), M()), R('date de naissance'), M()))
