Replace asserts with exceptions in generate_test_code.py
diff --git a/tests/scripts/generate_test_code.py b/tests/scripts/generate_test_code.py
index f668128..22066f7 100755
--- a/tests/scripts/generate_test_code.py
+++ b/tests/scripts/generate_test_code.py
@@ -62,6 +62,13 @@
     pass
 
 
+class GeneratorInputError(Exception):
+    """
+    Exception to indicate error in the input to the generator.
+    """
+    pass
+
+
 class FileWrapper(io.FileIO):
     """
     File wrapper class. Provides reading with line no. tracking.
@@ -353,8 +360,10 @@
             func_name, args, func_code, func_dispatch = parse_function_code(funcs_f, deps, suite_deps)
             suite_functions += func_code
             # Generate dispatch code and enumeration info
-            assert func_name not in func_info, "file: %s - function %s re-declared at line %d" % \
-                                               (funcs_f.name, func_name, funcs_f.line_no)
+            if func_name in func_info:
+                raise GeneratorInputError(
+                    "file: %s - function %s re-declared at line %d" % \
+                    (funcs_f.name, func_name, funcs_f.line_no))
             func_info[func_name] = (function_idx, args)
             dispatch_code += '/* Function Id: %d */\n' % function_idx
             dispatch_code += func_dispatch
@@ -411,8 +420,9 @@
 
         # Blank line indicates end of test
         if len(line) == 0:
-            assert state != STATE_READ_ARGS, "Newline before arguments. " \
-                                                 "Test function and arguments missing for %s" % name
+            if state == STATE_READ_ARGS:
+                raise GeneratorInputError("Newline before arguments. " \
+                        "Test function and arguments missing for %s" % name)
             continue
 
         if state == STATE_READ_NAME:
@@ -432,8 +442,9 @@
                 yield name, function, deps, args
                 deps = []
                 state = STATE_READ_NAME
-    assert state != STATE_READ_ARGS, "Newline before arguments. " \
-                                     "Test function and arguments missing for %s" % name
+    if state == STATE_READ_ARGS:
+        raise GeneratorInputError("Newline before arguments. " \
+                "Test function and arguments missing for %s" % name)
 
 
 def gen_dep_check(dep_id, dep):
@@ -444,9 +455,11 @@
     :param dep: Dependency macro
     :return: Dependency check code
     """
-    assert dep_id > -1, "Dependency Id should be a positive integer."
+    if dep_id < 0:
+        raise GeneratorInputError("Dependency Id should be a positive integer.")
     noT, dep = ('!', dep[1:]) if dep[0] == '!' else ('', dep)
-    assert len(dep) > 0, "Dependency should not be an empty string."
+    if len(dep) == 0:
+        raise GeneratorInputError("Dependency should not be an empty string.")
     dep_check = '''
         case {id}:
             {{
@@ -468,8 +481,10 @@
     :param exp: Expression/Macro
     :return: Expression check code
     """
-    assert exp_id > -1, "Expression Id should be a positive integer."
-    assert len(exp) > 0, "Expression should not be an empty string."
+    if exp_id < 0:
+        raise GeneratorInputError("Expression Id should be a positive integer.")
+    if len(exp) == 0:
+        raise GeneratorInputError("Expression should not be an empty string.")
     exp_code = '''
         case {exp_id}:
             {{
@@ -583,13 +598,15 @@
 
         # Write test function name
         test_function_name = 'test_' + function_name
-        assert test_function_name in func_info, "Function %s not found!" % test_function_name
+        if test_function_name not in func_info:
+            raise GeneratorInputError("Function %s not found!" % test_function_name)
         func_id, func_args = func_info[test_function_name]
         out_data_f.write(str(func_id))
 
         # Write parameters
-        assert len(test_args) == len(func_args), \
-            "Invalid number of arguments in test %s. See function %s signature." % (test_name, function_name)
+        if len(test_args) != len(func_args):
+            raise GeneratorInputError("Invalid number of arguments in test %s. See function %s signature." % (test_name,
+                        function_name))
         expression_code += write_parameters(out_data_f, test_args, func_args, unique_expressions)
 
         # Write a newline as test case separator
@@ -726,4 +743,8 @@
 
 
 if __name__ == "__main__":
-    check_cmd()
+    try:
+        check_cmd()
+    except GeneratorInputError as e:
+        script_name = os.path.basename(sys.argv[0])
+        print("%s: input error: %s" % (script_name, str(e)))
diff --git a/tests/scripts/test_generate_test_code.py b/tests/scripts/test_generate_test_code.py
index a4debba..9964ab9 100755
--- a/tests/scripts/test_generate_test_code.py
+++ b/tests/scripts/test_generate_test_code.py
@@ -1,3 +1,4 @@
+#!/usr/bin/env python
 # Unit test for generate_test_code.py
 #
 # Copyright (C) 2018, ARM Limited, All Rights Reserved
@@ -857,7 +858,7 @@
 /* END_CASE */
 '''
         s = StringIOWrapper('test_suite_ut.function', data)
-        self.assertRaises(AssertionError, parse_functions, s)
+        self.assertRaises(GeneratorInputError, parse_functions, s)
 
 
 class ExcapedSplit(TestCase):
@@ -994,7 +995,7 @@
 
     def test_no_args(self):
         """
-        Test AssertionError is raised when test function name and args line is missing.
+        Test GeneratorInputError is raised when test function name and args line is missing.
         :return:
         """
         data = """
@@ -1011,13 +1012,13 @@
         try:
             for x, y, z, a in parse_test_data(s):
                 pass
-        except AssertionError, e:
+        except GeneratorInputError as e:
             pass
-        self.assertEqual(type(e), AssertionError)
+        self.assertEqual(type(e), GeneratorInputError)
 
     def test_incomplete_data(self):
         """
-        Test AssertionError is raised when test function name and args line is missing.
+        Test GeneratorInputError is raised when test function name and args line is missing.
         :return:
         """
         data = """
@@ -1029,9 +1030,9 @@
         try:
             for x, y, z, a in parse_test_data(s):
                 pass
-        except AssertionError, e:
+        except GeneratorInputError as e:
             pass
-        self.assertEqual(type(e), AssertionError)
+        self.assertEqual(type(e), GeneratorInputError)
 
 
 class GenDepCheck(TestCase):
@@ -1080,14 +1081,14 @@
         Test invalid dependency input.
         :return:
         """
-        self.assertRaises(AssertionError, gen_dep_check, 5, '!')
+        self.assertRaises(GeneratorInputError, gen_dep_check, 5, '!')
 
     def test_negative_dep_id(self):
         """
         Test invalid dependency input.
         :return:
         """
-        self.assertRaises(AssertionError, gen_dep_check, -1, 'YAHOO')
+        self.assertRaises(GeneratorInputError, gen_dep_check, -1, 'YAHOO')
 
 
 class GenExpCheck(TestCase):
@@ -1114,14 +1115,14 @@
         Test invalid expression input.
         :return:
         """
-        self.assertRaises(AssertionError, gen_expression_check, 5, '')
+        self.assertRaises(GeneratorInputError, gen_expression_check, 5, '')
 
     def test_negative_exp_id(self):
         """
         Test invalid expression id.
         :return:
         """
-        self.assertRaises(AssertionError, gen_expression_check, -1, 'YAHOO')
+        self.assertRaises(GeneratorInputError, gen_expression_check, -1, 'YAHOO')
 
 
 class WriteDeps(TestCase):
@@ -1437,7 +1438,7 @@
         out_data_f = StringIOWrapper('test_suite_ut.datax', '')
         func_info = {'test_func2': (1, ('int',))}
         suite_deps = []
-        self.assertRaises(AssertionError, gen_from_test_data, data_f, out_data_f, func_info, suite_deps)
+        self.assertRaises(GeneratorInputError, gen_from_test_data, data_f, out_data_f, func_info, suite_deps)
 
     def test_different_func_args(self):
         """
@@ -1453,7 +1454,7 @@
         out_data_f = StringIOWrapper('test_suite_ut.datax', '')
         func_info = {'test_func2': (1, ('int','hex'))}
         suite_deps = []
-        self.assertRaises(AssertionError, gen_from_test_data, data_f, out_data_f, func_info, suite_deps)
+        self.assertRaises(GeneratorInputError, gen_from_test_data, data_f, out_data_f, func_info, suite_deps)
 
     def test_output(self):
         """