Mercurial > hg > ltpda
diff testing/utp_1.1/buildxml.rb @ 44:409a22968d5e default
Add unit tests
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Tue, 06 Dec 2011 18:42:11 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/testing/utp_1.1/buildxml.rb Tue Dec 06 18:42:11 2011 +0100 @@ -0,0 +1,220 @@ +#!/usr/bin/ruby + +require 'ostruct' +require 'unittest' +require 'rexml/document' +include REXML + +options = OpenStruct.new +options.outfile = "" +options.infile = "" +options.version = "unknown" + +if ARGV[1]==nil then + puts "Usage: buildxml.rb <inputfile> <outputfile>" + exit +else + options.infile = ARGV[0] + options.outfile = ARGV[1] +end + +class UnitTestProcessor + attr_accessor :ut + + def initialize + @ut = UnitTest.new + @results = [] + end + + def result=(newResult) + testvalues = newResult.split(",") + @ut.path = getPath(testvalues) + @ut.title = getTitle(testvalues) + @ut.code = getCode(testvalues) + result = Result.new + result.syntax = testvalues[1] + result.algorithm = testvalues[2] + result.date = Date.new(testvalues[4].to_i) + result.number = testvalues[3].to_i + @ut.results << result + end + + # generates the path out of the test name + def getPath(testvalues) + parts = testvalues[0].split("_") + folder = parts[1] + parts.pop + filename = parts.join("_") + ".m" + "utps/" + folder + "/" + filename + end + + # generates the title out of the test name + def getTitle(testvalues) + parts = testvalues[0].split("_") + parts.pop + parts.shift + #parts[0].upcase! + parts.join(" ") + end + + # generates the title out of the test name + def getCode(testvalues) + parts = testvalues[0].split("_") + parts.pop + parts.join("_") + end + + def parseFile + begin + if !File.exists? @ut.path then + return + end + inFile = File.new(@ut.path) + currentTest = SubTest.new + while line = inFile.readline.chomp + # TODO: strip HTML-Tags + # remove trailing spaces + line.rstrip! + + if line.match /[%]+[ ]+UTP_[0-9]+/ then + currentTest = SubTest.new + parts = line.split("_") + currentTest.number = parts[1].to_i + end + + if line.match(/[%]+[ ]+END[ ]+UTP_[0-9]+/) and currentTest.number > 0 then + @ut.tests << currentTest + end + + if line.match "</MethodDescription>" then writeTo = "none" end + if line.match "</SyntaxDescription>" then writeTo = "none" end + if line.match "</TestDescription>" then writeTo = "none" end + if line.match "</AlgoDescription>" then writeTo = "none" end + if line.match "</SyntaxCode>" then writeTo = "none" end + if line.match "</AlgoCode>" then writeTo = "none" end + + + + case writeTo + when "none" then + a = 1 + when "algoCode" then + currentTest.algoCode += line + "\n" + when "algoDescription" then + currentTest.algoDescription += removeComment line + when "syntaxCode" then + currentTest.syntaxCode += line + "\n" + when "syntaxDescription" then + currentTest.syntaxDescription += removeComment line + when "methodDescription" then + @ut.methodDescription += removeComment line + when "testDescription" then + currentTest.testDescription += removeComment line + end + + if line.match "<MethodDescription>" then writeTo = "methodDescription" end + if line.match "<SyntaxDescription>" then writeTo = "syntaxDescription" end + if line.match "<TestDescription>" then writeTo = "testDescription" end + if line.match "<AlgoDescription>" then writeTo = "algoDescription" end + if line.match "<SyntaxCode>" then writeTo = "syntaxCode" end + if line.match "<AlgoCode>" then writeTo = "algoCode" end + + end + rescue EOFError + inFile.close + end + end + + # The analysis of a single line of the .m file + def removeComment(line) + line.strip! + while line.match /^%/ + # not elegant, but works in every realistic case (cut off at 100000 chars) + line = line[1,100000] + line.strip! + end + if line.length>0 then + line = line + "<br />" + end + line + end + + # Merge Results and Test for easier access + def mergeTestsAndResults + @ut.tests.each do |t| + @ut.results.each do |r| + if t.number == r.number then + t.date = r.date + t.syntaxResult = r.syntax.to_i + t.algoResult = r.algorithm.to_i + if t.syntaxResult==0 or t.algoResult==0 then + @ut.tainted = true + end + end + end + end + end +end + +infile = File.open(options.infile, 'r'); +outfile = File.open(options.outfile, 'w'); + +tests = [] + +begin + while line = infile.readline.chomp + testvalues = line.split(",") + parts = testvalues[0].split("_") + parts.pop + tests << parts.join("_") + end +rescue EOFError + infile.close +end + +tests = tests.uniq + +# For testing: tests fet only for the first test +#tests = [] +#tests << "utp_ao_join_fsdata" +utps = [] +puts "Collecting data ..." +tests.each do |t| + inFile = File.open(options.infile, 'r') + utp = UnitTestProcessor.new + begin + while line = inFile.readline.chomp + if line.match t then + utp.result = line + end + end + rescue EOFError + inFile.close + end + utps << utp +end + +unittests = [] + +i=1 + +utps.each do |u| + puts "Parsing file " + i.to_s + " of " + utps.length.to_s + " (" + u.ut.path + ") ..." + i += 1 + u.parseFile + u.mergeTestsAndResults + unittests << u.ut +end + +#if(options.outfile HERE MATCHES DAT) then + Marshal.dump(unittests, outfile) +#elseif(optione.outfile. HERE MATCHES XML then +# doc = Document.new() +# root = Element.new("Report") +# root.add_attribute 'date', Time.now.to_s +# root.add_attribute 'version', options.version +# unittests.each do |u| +# testEl = Element.new(" +# end +#end +outfile.close