class TestFilterGeneric(unittest.TestCase):
    def setUp(self):
        self.logger = ManifestLogger(False)
        self.utils = ManifestUtils(self.logger)

    def test_include_bad_indata(self):
        files = sample_data.files()

        # None as list
        self.assertRaises(
            Exception, lambda: self.utils._filter_generic(
                None, FilterAttribute.PATH, "onkey", FilterAction.INCLUDE,
                FilterModifier.ANY))

        # Existing but faulty list
        self.assertRaises(
            Exception, lambda: self.utils._filter_generic([
            ], FilterAttribute.PATH, "onkey", FilterAction.INCLUDE,
                                                          FilterModifier.ANY))
        # No filter
        self.assertRaises(
            Exception, lambda: self.utils._filter_generic(
                files, None, "onkey", FilterAction.INCLUDE, FilterModifier.ANY)
        )

        # Incorrect filter
        self.assertRaises(
            Exception, lambda: self.utils._filter_generic(
                files, "incrorect indata", "onkey", FilterAction.INCLUDE,
                FilterModifier.ANY))

        # Incorrect filter action
        self.assertRaises(
            Exception, lambda: self.utils._filter_generic(
                files, FilterAttribute.PATH, "onkey", None, FilterModifier.ANY)
        )

        # Incorrect filter action
        self.assertRaises(
            Exception, lambda: self.utils._filter_generic(
                files, FilterAttribute.PATH, "onkey", "incorrect data",
                FilterModifier.ANY))
        # None as modifier
        self.assertRaises(
            Exception, lambda: self.utils._filter_generic(
                files, FilterAttribute.PATH, "onkey", FilterAction.INCLUDE,
                None))
        # Incorrect modifier
        self.assertRaises(
            Exception, lambda: self.utils._filter_generic(
                files, FilterAttribute.PATH, "onkey", FilterAction.INCLUDE,
                "incorrect data"))

    def test_include_path(self):

        files = sample_data.files()

        assert len(files['included']) == 6
        assert len(files['excluded']) == 0

        self.utils._filter_generic(files, FilterAttribute.PATH, "onkey",
                                   FilterAction.INCLUDE, FilterModifier.ANY)

        assert len(files['included']) == 3
        assert len(files['excluded']) == 3

        # try include same files, no change
        self.utils._filter_generic(files, FilterAttribute.PATH, "onkey",
                                   FilterAction.INCLUDE, FilterModifier.ANY)

        assert len(files['included']) == 3
        assert len(files['excluded']) == 3

    def test_exclude_path(self):

        files = sample_data.files()

        assert len(files['included']) == 6
        assert len(files['excluded']) == 0

        self.utils._filter_generic(files, FilterAttribute.PATH, "onkey",
                                   FilterAction.EXCLUDE, FilterModifier.ANY)

        assert len(files['included']) == 3
        assert len(files['excluded']) == 3

        # try include same files, no change
        self.utils._filter_generic(files, FilterAttribute.PATH, "onkey",
                                   FilterAction.EXCLUDE, FilterModifier.ANY)

        assert len(files['included']) == 3
        assert len(files['excluded']) == 3

    def test_exclude_license(self):

        files = sample_data.files()

        assert len(files['included']) == 6
        assert len(files['excluded']) == 0

        self.utils._filter_generic(files, FilterAttribute.LICENSE, "mit",
                                   FilterAction.EXCLUDE, FilterModifier.ANY)

        assert len(files['included']) == 5
        assert len(files['excluded']) == 1

        # try include same files, no change
        self.utils._filter_generic(files, FilterAttribute.PATH, "mit",
                                   FilterAction.EXCLUDE, FilterModifier.ANY)

        assert len(files['included']) == 5
        assert len(files['excluded']) == 1

    def test_include_license(self):

        files = sample_data.files()

        assert len(files['included']) == 6
        assert len(files['excluded']) == 0

        self.utils._filter_generic(files, FilterAttribute.LICENSE, "mit",
                                   FilterAction.INCLUDE, FilterModifier.ANY)

        assert len(files['included']) == 1
        assert len(files['excluded']) == 5

        # try include same files, no change
        self.utils._filter_generic(files, FilterAttribute.LICENSE, "mit",
                                   FilterAction.INCLUDE, FilterModifier.ANY)

        assert len(files['included']) == 1
        assert len(files['excluded']) == 5

    def test_include_only_license(self):

        files = sample_data.files()

        assert len(files['included']) == 6
        assert len(files['excluded']) == 0

        self.utils._filter_generic(files, FilterAttribute.LICENSE,
                                   "gpl-2.0-or-later", FilterAction.INCLUDE,
                                   FilterModifier.ANY)

        assert len(files['included']) == 2
        assert len(files['excluded']) == 4

        files = sample_data.files()

        # try include same files, no change
        self.utils._filter_generic(files, FilterAttribute.LICENSE,
                                   "gpl-2.0-or-later", FilterAction.INCLUDE,
                                   FilterModifier.ONLY)

        assert len(files['included']) == 1
        assert len(files['excluded']) == 5
class TestFilterGeneric(unittest.TestCase):
    def setUp(self):
        self.logger = ManifestLogger(False)
        self.utils = ManifestUtils(self.logger)

    def test_include_bad_indata(self):
        files = sample_data.files()

        # None as liste
        self.assertRaises(
            Exception, lambda: self.utils._filter_generic(
                None, FilterAttribute.PATH, "onkey", FilterAction.INCLUDE,
                FilterModifier.ANY))

        # Existing but faulty list
        self.assertRaises(
            Exception, lambda: self.utils._filter_generic([
            ], FilterAttribute.PATH, "onkey", FilterAction.INCLUDE,
                                                          FilterModifier.ANY))
        # No filter
        self.assertRaises(
            Exception, lambda: self.utils._filter_generic(
                files, None, "onkey", FilterAction.INCLUDE, FilterModifier.ANY)
        )

        # Incorrect filter
        self.assertRaises(
            Exception, lambda: self.utils._filter_generic(
                files, "incrorect indata", "onkey", FilterAction.INCLUDE,
                FilterModifier.ANY))

        # Incorrect filter action
        self.assertRaises(
            Exception, lambda: self.utils._filter_generic(
                files, FilterAttribute.PATH, "onkey", None, FilterModifier.ANY)
        )

        # Incorrect filter action
        self.assertRaises(
            Exception, lambda: self.utils._filter_generic(
                files, FilterAttribute.PATH, "onkey", "incorrect data",
                FilterModifier.ANY))
        # None as modifier
        self.assertRaises(
            Exception, lambda: self.utils._filter_generic(
                files, FilterAttribute.PATH, "onkey", FilterAction.INCLUDE,
                None))
        # Incorrect modifier
        self.assertRaises(
            Exception, lambda: self.utils._filter_generic(
                files, FilterAttribute.PATH, "onkey", FilterAction.INCLUDE,
                "incorrect data"))

    def test_include_path(self):

        files = sample_data.files()

        self.assertTrue(len(files['included']) == 6)
        self.assertTrue(len(files['excluded']) == 0)

        self.utils._filter_generic(files, FilterAttribute.PATH, "onkey",
                                   FilterAction.INCLUDE, FilterModifier.ANY)

        self.assertTrue(len(files['included']) == 3)
        self.assertTrue(len(files['excluded']) == 3)

        # try include same files, no change
        self.utils._filter_generic(files, FilterAttribute.PATH, "onkey",
                                   FilterAction.INCLUDE, FilterModifier.ANY)

        self.assertTrue(len(files['included']) == 3)
        self.assertTrue(len(files['excluded']) == 3)

    def test_exclude_path(self):

        files = sample_data.files()

        self.assertTrue(len(files['included']) == 6)
        self.assertTrue(len(files['excluded']) == 0)

        self.utils._filter_generic(files, FilterAttribute.PATH, "onkey",
                                   FilterAction.EXCLUDE, FilterModifier.ANY)

        self.assertTrue(len(files['included']) == 3)
        self.assertTrue(len(files['excluded']) == 3)

        # try include same files, no change
        self.utils._filter_generic(files, FilterAttribute.PATH, "onkey",
                                   FilterAction.EXCLUDE, FilterModifier.ANY)

        self.assertTrue(len(files['included']) == 3)
        self.assertTrue(len(files['excluded']) == 3)

    def test_exclude_license(self):

        files = sample_data.files()

        self.assertTrue(len(files['included']) == 6)
        self.assertTrue(len(files['excluded']) == 0)

        self.utils._filter_generic(files, FilterAttribute.LICENSE, "mit",
                                   FilterAction.EXCLUDE, FilterModifier.ANY)

        self.assertTrue(len(files['included']) == 5)
        self.assertTrue(len(files['excluded']) == 1)

        # try include same files, no change
        self.utils._filter_generic(files, FilterAttribute.PATH, "mit",
                                   FilterAction.EXCLUDE, FilterModifier.ANY)

        self.assertTrue(len(files['included']) == 5)
        self.assertTrue(len(files['excluded']) == 1)

    def test_include_license(self):

        files = sample_data.files()

        self.assertTrue(len(files['included']) == 6)
        self.assertTrue(len(files['excluded']) == 0)

        self.utils._filter_generic(files, FilterAttribute.LICENSE, "mit",
                                   FilterAction.INCLUDE, FilterModifier.ANY)

        self.assertTrue(len(files['included']) == 1)
        self.assertTrue(len(files['excluded']) == 5)

        # try include same files, no change
        self.utils._filter_generic(files, FilterAttribute.LICENSE, "mit",
                                   FilterAction.INCLUDE, FilterModifier.ANY)

        self.assertTrue(len(files['included']) == 1)
        self.assertTrue(len(files['excluded']) == 5)

    def test_include_only_license(self):

        files = sample_data.files()

        self.assertTrue(len(files['included']) == 6)
        self.assertTrue(len(files['excluded']) == 0)

        self.utils._filter_generic(files, FilterAttribute.LICENSE,
                                   "gpl-2.0-or-later", FilterAction.INCLUDE,
                                   FilterModifier.ANY)

        self.assertTrue(len(files['included']) == 2)
        self.assertTrue(len(files['excluded']) == 4)

        #print("inc: " + str(len(files['included'])))
        #for f in files['included']:
        #    import json
        #    print(" * " + str(f['path']) + str(f['license_expressions']))
        #print("exc: " + str(len(files['excluded'])))
        #for f in files['excluded']:
        #    print(" * " + str(f['path']) + str(f['license_expressions']))
        #print("")

        # try include ONLY license
        self.utils._filter_generic(files, FilterAttribute.LICENSE,
                                   "gpl-2.0-or-later", FilterAction.INCLUDE,
                                   FilterModifier.ONLY)

        self.assertTrue(len(files['included']) == 1)
        self.assertTrue(len(files['excluded']) == 5)