
# Copyright 2017-present Open Networking Foundation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


import unittest
import os
from xosgenx.generator import XOSProcessor, XOSProcessorArgs

VROUTER_XPROTO = os.path.abspath(os.path.dirname(os.path.realpath(__file__)) + "/xproto/vrouterport.xproto")

# Generate Protobuf from Xproto and then parse the resulting Protobuf
class XProtoProtobufGeneratorTest(unittest.TestCase):
    def test_proto_generator(self):
        """
        [XOS-GenX] Generate DJANGO models, verify Fields and Foreign Keys
        """
        args = XOSProcessorArgs(files = [VROUTER_XPROTO],
                                target = 'django.xtarget')
        output = XOSProcessor.process(args)

        fields = filter(lambda s:'Field(' in s, output.splitlines())
        self.assertEqual(len(fields), 2)
        links = filter(lambda s:'Key(' in s, output.splitlines())
        self.assertEqual(len(links), 2)

    def test_optional_relations(self):
        """
        [XOS-GenX] Generate DJANGO models, verify relations
        """
        xproto = \
            """
            option app_label = "test";

            message ENodeB {
            }
            
            message Handover {
            }

            message Foo {
                optional manytoone enodeb->ENodeB:profiles = 1 [null = True, blank = True];
                required manytoone handover->Handover:profiles = 2 [null = False, blank = False];
            }
            """

        args = XOSProcessorArgs(inputs = xproto,
                                target = 'django.xtarget')
        output = XOSProcessor.process(args)

        null_true = filter(lambda s: 'null = True' in s, output.splitlines())
        null_false = filter(lambda s: 'null = False' in s, output.splitlines())

        blank_true = filter(lambda s: 'blank = True' in s, output.splitlines())
        blank_false = filter(lambda s: 'blank = False' in s, output.splitlines())

        self.assertEqual(len(null_true), 1)
        self.assertEqual(len(null_false), 1)
        self.assertEqual(len(blank_true), 1)
        self.assertEqual(len(blank_false), 1)

    def test_feedback_state(self):
        """
        [XOS-GenX] Generate DJANGO models, verify feedback_state fields
        """
        xproto = \
            """
            option app_label = "test";

            message ParentFoo {
                required string parent_name = 1 [null = False, blank = False, feedback_state = True];
            }

            message Foo (ParentFoo) {
                required string name = 1 [null = False, blank = False, feedback_state = True];
            }
            """

        args = XOSProcessorArgs(inputs = xproto,
                                target = 'django.xtarget')
        output = XOSProcessor.process(args)

        self.assertIn("feedback_state_fields = ['parent_name', 'name']", output)

    def test_min_max_validators(self):
        """
        [XOS-GenX] Use django validors for min and max values
        """
        xproto = \
            """
            option app_label = "test";

            message Foo (ParentFoo) {
                required int32 val = 1 [min_value = 1, max_value = 10];
            }
            """

        args = XOSProcessorArgs(inputs = xproto,
                                target = 'django.xtarget')
        output = XOSProcessor.process(args)

        self.assertIn("validators=[", output)
        self.assertIn("MinValueValidator(1)", output)
        self.assertIn("MaxValueValidator(10)", output)

if __name__ == '__main__':
    unittest.main()


