class FilterTest(unittest.TestCase):
    """test that all fields are correctly validated"""

    def setUp(self):
        """override one in unittest.TestCase"""
        write_test_profile()
        # load profile
        self.document = FilterDocument()
        self.document.load(FILTER_TEST)

    def assert_content(self, document):
        self.assertEquals(3, len(self.document.filters))
        self.assert_(self.document.filters["All"].filter_or)
        self.assert_(self.document.filters["MP3"].filter_or)
        self.assertEquals(False, self.document.filters["Mr_B"].filter_or)
        all_dict = self.document.filters["All"].as_dict()
        peer_dict = self.document.filters["Mr_B"].as_dict()
        file_dict = self.document.filters["MP3"].as_dict()
        self.assertEquals('*, (1)', all_dict['pseudo'])
        self.assertEquals('.mp3, (1)', file_dict['name'])
        self.assertEquals('*, (1)', peer_dict['pseudo'])
        self.assertEquals('Mr, (1)', peer_dict['title'])
        self.assertEquals('b, (1)', peer_dict['lastname'])
        self.assertEquals('blue, (1)', peer_dict['color'])
            
    def test_load(self):
        self.assert_content(self.document)

    def test_import(self):
        doc = FilterDocument()
        doc.import_document(self.document)
        self.assert_content(doc)

    def test_match(self):
        peer_desc = PeerDescriptor(PROFILE_TEST)
        peer_desc.load(directory=PROFILE_DIR)
        self.document.match(peer_desc)
        # check results
        self.assertEquals(3, len(self.document.results))
        self.assert_('All' in self.document.results)
        self.assert_('Mr_B' in self.document.results)
        self.assert_('MP3' in self.document.results)
        results = [(result.get_name(), result.get_match())
                   for result in self.document.results['Mr_B'][PROFILE_TEST]]
        results.sort()
        self.assertEquals([('color', 'blue'),
                           ('lastname', 'breton'),
                           ('pseudo', 'atao'),
                           ('title', 'Mr')],
                          results)