Unit test generate_copy.py
diff --git a/tests/scripts/generate_code.py b/tests/scripts/generate_code.py
index c6fc03f..b0b3686 100644
--- a/tests/scripts/generate_code.py
+++ b/tests/scripts/generate_code.py
@@ -1,6 +1,6 @@
 """
-mbed SDK
-Copyright (c) 2017-2018 ARM Limited
+mbed TLS
+Copyright (c) 2017 ARM Limited
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
@@ -25,17 +25,15 @@
 Generates code in following structure.
 
 <output dir>/
-|-- host_tests/
-|   |-- mbedtls_test.py
-|   |-- mbedtls/
-|   |   |-- <test suite #1>/
-|   |   |    |-- main.c
-|   |   |    |-- *.data files
-|   |   ...
-|   |   |-- <test suite #n>/
-|   |   |    |-- main.c
-|   |   |    |-- *.data files
-|   |   |
+ |-- mbedtls/
+ |   |-- <test suite #1>/
+ |   |    |-- main.c
+ |   |    |-- *.data files
+ |   ...
+ |   |-- <test suite #n>/
+ |   |    |-- main.c
+ |   |    |-- *.data files
+ |   |
 """
 
 
@@ -56,6 +54,44 @@
     pass
 
 
+class FileWrapper(file):
+    """
+    File wrapper class. Provides reading with line no. tracking. 
+    """
+
+    def __init__(self, file_name):
+        """
+        Init file handle.
+        
+        :param file_name: 
+        """
+        super(FileWrapper, self).__init__(file_name, 'r')
+        self.line_no = 0
+
+    def next(self):
+        """
+        Iterator return impl.
+        :return: 
+        """
+        line = super(FileWrapper, self).next()
+        if line:
+            self.line_no += 1
+        return line
+
+    def readline(self, limit=0):
+        """
+        Wrap the base class readline.
+        
+        :param limit: 
+        :return: 
+        """
+        return self.next()
+
+
+def split_dep(dep):
+    return ('!', dep[1:]) if dep[0] == '!' else ('', dep)
+
+
 def gen_deps(deps):
     """
     Generates dependency i.e. if def and endif code
@@ -63,16 +99,9 @@
     :param deps:
     :return:
     """
-    dep_start = ''
-    dep_end = ''
-    for dep in deps:
-        if dep[0] == '!':
-            noT = '!'
-            dep = dep[1:]
-        else:
-            noT = ''
-        dep_start += '#if %sdefined(%s)\n' % (noT, dep)
-        dep_end = '#endif /* %s%s */\n' % (noT, dep) + dep_end
+    dep_start = ''.join(['#if %sdefined(%s)\n' % split_dep(x) for x in deps])
+    dep_end = ''.join(['#endif /* %s */\n' % x for x in reversed(deps)])
+
     return dep_start, dep_end
 
 
@@ -83,22 +112,16 @@
     :param deps:
     :return:
     """
-    defines = []
-    for dep in deps:
-        if dep[0] == '!':
-            noT = '!'
-            dep = dep[1:]
-        else:
-            noT = ''
-        defines.append('%sdefined(%s)' % (noT, dep))
-    return '#if ' + ' && '.join(defines)
+    defines = ('#if ' if len(deps) else '') + ' && '.join(['%sdefined(%s)' % split_dep(x) for x in deps])
+    return defines
 
 
-def gen_function_wrapper(name, args_dispatch):
+def gen_function_wrapper(name, locals, args_dispatch):
     """
     Creates test function code
 
     :param name:
+    :param locals:
     :param args_dispatch:
     :return:
     """
@@ -110,9 +133,9 @@
 {locals}
     {name}( {args} );
 }}
-'''.format(name=name, unused_params='(void)params;' if len(args_dispatch[1]) == 0 else '',
-           args=', '.join(args_dispatch[1]),
-           locals=args_dispatch[0])
+'''.format(name=name, unused_params='(void)params;' if len(args_dispatch) == 0 else '',
+           args=', '.join(args_dispatch),
+           locals=locals)
     return wrapper
 
 
@@ -141,37 +164,33 @@
     return dispatch_code
 
 
-def parse_suite_headers(line_no, funcs_f):
+def parse_suite_headers(funcs_f):
     """
     Parses function headers.
     
-    :param line_no:
     :param funcs_f: 
     :return: 
     """
-    headers = '#line %d "%s"\n' % (line_no + 1, funcs_f.name)
+    headers = '#line %d "%s"\n' % (funcs_f.line_no + 1, funcs_f.name)
     for line in funcs_f:
-        line_no += 1
         if re.search(END_HEADER_REGEX, line):
             break
         headers += line
     else:
         raise InvalidFileFormat("file: %s - end header pattern [%s] not found!" % (funcs_f.name, END_HEADER_REGEX))
 
-    return line_no, headers
+    return headers
 
 
-def parse_suite_deps(line_no, funcs_f):
+def parse_suite_deps(funcs_f):
     """
     Parses function dependencies.
     
-    :param line_no:
     :param funcs_f: 
     :return: 
     """
     deps = []
     for line in funcs_f:
-        line_no += 1
         m = re.search('depends_on\:(.*)', line.strip())
         if m:
             deps += [x.strip() for x in m.group(1).split(':')]
@@ -180,7 +199,7 @@
     else:
         raise InvalidFileFormat("file: %s - end dependency pattern [%s] not found!" % (funcs_f.name, END_DEP_REGEX))
 
-    return line_no, deps
+    return deps
 
 
 def parse_function_deps(line):
@@ -195,7 +214,7 @@
     if len(dep_str):
         m = re.search('depends_on:(.*)', dep_str)
         if m:
-            deps = m.group(1).strip().split(':')
+            deps = [x.strip() for x in m.group(1).strip().split(':')]
     return deps
 
 
@@ -234,13 +253,13 @@
             args_dispatch.append('&hex%d' % arg_idx)
             arg_idx += 1
         else:
-            raise ValueError("Test function arguments can only be 'int' or 'char *'\n%s" % line)
+            raise ValueError("Test function arguments can only be 'int', 'char *' or 'HexParam_t'\n%s" % line)
         arg_idx += 1
 
-    return name, args, (locals, args_dispatch)
+    return name, args, locals, args_dispatch
 
 
-def parse_function_code(line_no, funcs_f, deps, suite_deps):
+def parse_function_code(funcs_f, deps, suite_deps):
     """
     
     :param line_no: 
@@ -249,9 +268,8 @@
     :param suite_deps:
     :return: 
     """
-    code = '#line %d "%s"\n' % (line_no + 1, funcs_f.name)
+    code = '#line %d "%s"\n' % (funcs_f.line_no + 1, funcs_f.name)
     for line in funcs_f:
-        line_no += 1
         # Check function signature
         m = re.match('.*?\s+(\w+)\s*\(', line, re.I)
         if m:
@@ -259,10 +277,9 @@
             if not re.match('.*\)', line):
                 for lin in funcs_f:
                     line += lin
-                    line_no += 1
                     if re.search('.*?\)', line):
                         break
-            name, args, args_dispatch = parse_function_signature(line)
+            name, args, locals, args_dispatch = parse_function_signature(line)
             code += line.replace(name, 'test_' + name)
             name = 'test_' + name
             break
@@ -270,7 +287,6 @@
         raise InvalidFileFormat("file: %s - Test functions not found!" % funcs_f.name)
 
     for line in funcs_f:
-        line_no += 1
         if re.search(END_CASE_REGEX, line):
             break
         code += line
@@ -281,16 +297,14 @@
     if code.find('exit:') == -1:
         s = code.rsplit('}', 1)
         if len(s) == 2:
-            code = """
-exit:
+            code = """exit:
     ;;
-}
-""".join(s)
+}""".join(s)
 
-    code += gen_function_wrapper(name, args_dispatch)
+    code += gen_function_wrapper(name, locals, args_dispatch)
     ifdef, endif = gen_deps(deps)
     dispatch_code = gen_dispatch(name, suite_deps + deps)
-    return line_no, name, args, ifdef + code + endif, dispatch_code
+    return name, args, ifdef + code + endif, dispatch_code
 
 
 def parse_functions(funcs_f):
@@ -300,7 +314,6 @@
     :param funcs_f: 
     :return:
     """
-    line_no = 0
     suite_headers = ''
     suite_deps = []
     suite_functions = ''
@@ -308,20 +321,19 @@
     function_idx = 0
     dispatch_code = ''
     for line in funcs_f:
-        line_no += 1
         if re.search(BEGIN_HEADER_REGEX, line):
-            line_no, headers = parse_suite_headers(line_no, funcs_f)
+            headers = parse_suite_headers(funcs_f)
             suite_headers += headers
         elif re.search(BEGIN_DEP_REGEX, line):
-            line_no, deps = parse_suite_deps(line_no, funcs_f)
+            deps = parse_suite_deps(funcs_f)
             suite_deps += deps
         elif re.search(BEGIN_CASE_REGEX, line):
             deps = parse_function_deps(line)
-            line_no, func_name, args, func_code, func_dispatch = parse_function_code(line_no, funcs_f, deps, suite_deps)
+            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, line_no)
+                                               (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