

# Copyright (c) 2020, ARM Limited.
#
#    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.

from __future__ import print_function
import xml.etree.ElementTree as ET

class xunit_results():
    def __init__(self, name='Testsuites'):
        self.name = name
        self.suites = []
    def create_suite(self, name):
        s = xunit_suite(name)
        self.suites.append(s)
        return s
    def write_results(self, filename):
        suites = ET.Element(self.name)
        tree = ET.ElementTree(suites)
        for s in self.suites:
            testsuite = ET.SubElement(suites, 'testsuite', {'name' : s.name, 'errors' : '0'})
            tests = 0
            failures = 0
            skip = 0
            for t in s.tests:
                test = ET.SubElement(testsuite, 'testcase', {'name' : t.name, 'classname' : t.classname, 'time' : t.time})
                tests += 1
                if t.skip:
                    skip += 1
                    ET.SubElement(test, 'skipped', {'type' : 'Skipped test'})
                if t.fail:
                    failures += 1
                    fail = ET.SubElement(test, 'failure', {'type' : 'Test failed'})
                    fail.text = t.fail
                if t.sysout:
                    sysout = ET.SubElement(test, 'system-out')
                    sysout.text = t.sysout
                if t.syserr:
                    syserr = ET.SubElement(test, 'system-err')
                    syserr.text = t.syserr
            testsuite.attrib['tests'] = str(tests)
            testsuite.attrib['failures'] = str(failures)
            testsuite.attrib['skip'] = str(skip)
        tree.write(filename, 'UTF-8', True)


class xunit_suite():
    def __init__(self, name):
        self.name = name
        self.tests = []

class xunit_test():
    def __init__(self, name, classname=None):
        self.name = name
        if classname:
            self.classname = classname
        else:
            self.classname = name
        self.time = '0.000'
        self.fail = None
        self.skip = False
        self.sysout = None
        self.syserr = None
    def failed(self, text):
        self.fail = text
    def skipped(self):
        self.skip = True


if __name__ == '__main__':
    r = xunit_results()
    s = r.create_suite('selftest')
    for i in range(0,10):
        t = xunit_test('atest' + str(i))
        if i == 3:
            t.failed('Unknown failure foo')
        if i == 7:
            t.skipped()
        s.tests.append(t)
    r.write_results('foo.xml')
