[codeface] [PATCH 7/9] Add unit tests for the getFeatureLines functions.

  • From: Matthias Dittrich <matthi.d@xxxxxxxxxxxxxx>
  • To: codeface@xxxxxxxxxxxxx
  • Date: Fri, 17 Oct 2014 15:14:24 +0200

Added unit tests for the getFeatureLines function to ensure that it can properly
work with the parsed data of the parseFeatureLine function.

Signed-off-by: Matthias Dittrich <matthi.d@xxxxxxxxx>
---
 codeface/test/unit/test_getFeatureLines.py | 169 +++++++++++++++++++++++++++++
 1 file changed, 169 insertions(+)
 create mode 100644 codeface/test/unit/test_getFeatureLines.py

diff --git a/codeface/test/unit/test_getFeatureLines.py 
b/codeface/test/unit/test_getFeatureLines.py
new file mode 100644
index 0000000..c905cea
--- /dev/null
+++ b/codeface/test/unit/test_getFeatureLines.py
@@ -0,0 +1,169 @@
+# This file is part of Codeface. Codeface is free software: you can
+# redistribute it and/or modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation, version 2.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+# Copyright 2014, by Matthias Dittrich <matthi.d@xxxxxxxxx>
+# All Rights Reserved.
+
+import unittest
+
+from codeface.VCS import (getFeatureLines, parseFeatureLine, parseline, 
parseSepLine, ParseError, LineType)
+from operator import eq
+import logging
+logging.basicConfig()
+
+
+class TestFeatureLineParsing(unittest.TestCase):
+    """Tests for the getFeatureLines function"""
+
+    def testsepline(self):
+        """Check that we can parse the header"""
+        self.assertEqual(",", parseSepLine("\"sep=,\""))
+        self.assertEqual("-", parseSepLine("\"sep=-\""))
+        self.assertEqual(",", parseSepLine("\"sep=,\"\r\n"))
+        self.assertEqual(",", parseSepLine("\"sep=,\"\n\r"))
+        self.assertEqual(",", parseSepLine("\"sep=,\"\n"))
+
+
+
+        self.assertRaises(ParseError, parseSepLine, "\"sp=,\"")
+        self.assertRaises(ParseError, parseSepLine, "\"sep=,")
+
+        pass
+
+    def testline(self):
+        """Check that we can parse the first header line"""
+        self.assertListEqual(["FILENAME", "LINE_START", "LINE_END", "TYPE", 
"EXPRESSION", "CONSTANTS"],
+                             parseline(",", 
"FILENAME,LINE_START,LINE_END,TYPE,EXPRESSION,CONSTANTS"))
+        self.assertListEqual(["FILENAME", "LINE_START", "LINE_END", "TYPE", 
"EXPRESSION", "CONSTANTS"],
+                             parseline("-", 
"FILENAME-LINE_START-LINE_END-TYPE-EXPRESSION-CONSTANTS"))
+
+        
self.assertListEqual(["/tmp/tmpVemX4s_cppstats_featurelocations/_cppstats_featurelocations/tmpuAFx3b.xml",
 "1", "8", "#if", "defined(A)", "A"],
+                             parseline(",", 
"/tmp/tmpVemX4s_cppstats_featurelocations/_cppstats_featurelocations/tmpuAFx3b.xml,1,8,#if,defined(A),A"))
+        
self.assertListEqual(["/tmp/tmpVemX4s_cppstats_featurelocations/_cppstats_featurelocations/tmpuAFx3b.xml",
 "3", "5", "#if", "(defined(A)) && ((defined(C) || defined(D)))", "A;C;D"],
+                             parseline(",", 
"/tmp/tmpVemX4s_cppstats_featurelocations/_cppstats_featurelocations/tmpuAFx3b.xml,3,5,#if,(defined(A))
 && ((defined(C) || defined(D))),A;C;D"))
+
+        self.assertListEqual(["FILENAME", "LINE_START"], parseline(",", 
"FILENAME,LINE_START\r\n"))
+        self.assertListEqual(["FILENAME", "LINE_START"], parseline(",", 
"FILENAME,LINE_START\n"))
+        pass
+
+    def testfeatureline(self):
+        """Check that we can parse the first header line"""
+        startline, endline, featurelist = parseFeatureLine(",", 
"/tmp/tmpVemX4s_cppstats_featurelocations/_cppstats_featurelocations/tmpuAFx3b.xml,3,5,#if,(defined(A))
 && ((defined(C) || defined(D))),A;C;D")
+        self.assertEqual(3, startline)
+        self.assertEqual(5, endline)
+        self.assertListEqual(["A", "C", "D"], featurelist)
+
+        startline, endline, featurelist = parseFeatureLine(",", 
"/tmp/tmpVemX4s_cppstats_featurelocations/_cppstats_featurelocations/tmpuAFx3b.xml,1,8,#if,defined(A),A")
+        self.assertEqual(1, startline)
+        self.assertEqual(8, endline)
+        self.assertListEqual(["A"], featurelist)
+
+        pass
+
+class TestFeatureLines(unittest.TestCase):
+    """Tests for the getFeatureLines function"""
+
+    def testsingleline(self):
+        """Check that a single line is split as expected"""
+        feature_dict = getFeatureLines([(3, 5, LineType.IF, ["A", "B"])], 
"unittest.c")
+        self.assertSetEqual(feature_dict.get_line_info(2), set([]))
+        self.assertSetEqual(feature_dict.get_line_info(3), set(["A", "B"]))
+        self.assertSetEqual(feature_dict.get_line_info(4), set(["A", "B"]))
+        self.assertSetEqual(feature_dict.get_line_info(5), set(["A", "B"]))
+        self.assertSetEqual(feature_dict.get_line_info(6), set([]))
+        pass
+
+    def testfolllowingline(self):
+        """Check that a #ifdef can follow another #ifdef"""
+        feature_dict = getFeatureLines([(3, 5, LineType.IF, ["A", "B"]), (6, 
8, LineType.IF, ["C", "D"])], "unittest.c")
+        self.assertSetEqual(feature_dict.get_line_info(2), set([]))
+        self.assertSetEqual(feature_dict.get_line_info(3), set(["A", "B"]))
+        self.assertSetEqual(feature_dict.get_line_info(4), set(["A", "B"]))
+        self.assertSetEqual(feature_dict.get_line_info(5), set(["A", "B"]))
+        self.assertSetEqual(feature_dict.get_line_info(6), set(["C", "D"]))
+        self.assertSetEqual(feature_dict.get_line_info(7), set(["C", "D"]))
+        self.assertSetEqual(feature_dict.get_line_info(8), set(["C", "D"]))
+        self.assertSetEqual(feature_dict.get_line_info(9), set([]))
+        pass
+
+    def testorderdoesntmatter(self):
+        """Check that a #ifdef can follow another #ifdef"""
+        feature_dict = getFeatureLines([(6, 8, LineType.IF, ["C", "D"]), (3, 
5, LineType.IF, ["A", "B"])], "unittest.c")
+        self.assertSetEqual(feature_dict.get_line_info(2), set([]))
+        self.assertSetEqual(feature_dict.get_line_info(3), set(["A", "B"]))
+        self.assertSetEqual(feature_dict.get_line_info(4), set(["A", "B"]))
+        self.assertSetEqual(feature_dict.get_line_info(5), set(["A", "B"]))
+        self.assertSetEqual(feature_dict.get_line_info(6), set(["C", "D"]))
+        self.assertSetEqual(feature_dict.get_line_info(7), set(["C", "D"]))
+        self.assertSetEqual(feature_dict.get_line_info(8), set(["C", "D"]))
+        self.assertSetEqual(feature_dict.get_line_info(9), set([]))
+        pass
+
+    def testnesting(self):
+        """Check that a #ifdef can be nested in an another #ifdef"""
+        feature_dict = getFeatureLines([(3, 9, LineType.IF, ["A", "B"]), (6, 
8, LineType.IF, ["C", "D"])], "unittest.c")
+        self.assertSetEqual(feature_dict.get_line_info(2), set([]))
+        self.assertSetEqual(feature_dict.get_line_info(3), set(["A", "B"]))
+        self.assertSetEqual(feature_dict.get_line_info(4), set(["A", "B"]))
+        self.assertSetEqual(feature_dict.get_line_info(5), set(["A", "B"]))
+        self.assertSetEqual(feature_dict.get_line_info(6), set(["A", "B", "C", 
"D"]))
+        self.assertSetEqual(feature_dict.get_line_info(7), set(["A", "B", "C", 
"D"]))
+        self.assertSetEqual(feature_dict.get_line_info(8), set(["A", "B", "C", 
"D"]))
+        self.assertSetEqual(feature_dict.get_line_info(9), set(["A", "B"]))
+        self.assertSetEqual(feature_dict.get_line_info(10), set([]))
+        pass
+
+    def testnestingwithsamefeatures(self):
+        """Check that a #ifdef can be nested in another #ifdef but have the 
same feature"""
+        feature_dict = getFeatureLines([(3, 9, LineType.IF, ["A", "B"]), (6, 
8, LineType.IF, ["A", "D"])], "unittest.c")
+        self.assertSetEqual(feature_dict.get_line_info(2), set([]), "line 2 
should be empty")
+        self.assertSetEqual(feature_dict.get_line_info(3), set(["A", "B"]))
+        self.assertSetEqual(feature_dict.get_line_info(4), set(["A", "B"]))
+        self.assertSetEqual(feature_dict.get_line_info(5), set(["A", "B"]))
+        self.assertSetEqual(feature_dict.get_line_info(6), set(["A", "B", 
"D"]))
+        self.assertSetEqual(feature_dict.get_line_info(7), set(["A", "B", 
"D"]))
+        self.assertSetEqual(feature_dict.get_line_info(8), set(["A", "B", 
"D"]))
+        self.assertSetEqual(feature_dict.get_line_info(9), set(["A", "B"]))
+        self.assertSetEqual(feature_dict.get_line_info(10), set([]))
+        pass
+
+    def testinvalidstartend(self):
+        """Check we throw when end is before start"""
+        self.assertRaises(ParseError, getFeatureLines, [(5, 3, LineType.IF, 
["A", "B"])], "unittest.c")
+        pass
+
+    def testoverlapping(self):
+        """Check we throw when line is used multiple times"""
+        self.assertRaises(ParseError,
+                          getFeatureLines, [(3, 5, LineType.IF, ["A", "B"]), 
(3, 6, LineType.IF, ["C"])], "unittest.c")
+        pass
+
+
+    def testoverlapping_2(self):
+        """Check we throw when line is used multiple times"""
+        self.assertRaises(ParseError,
+                          getFeatureLines, [(3, 5, LineType.IF, ["A", "B"]), 
(5, 6, LineType.IF, ["C"])], "unittest.c")
+        pass
+
+
+    def testelif(self):
+        """Check we throw when line is used multiple times"""
+        # for example #elif "C" on line 5
+        feature_dict = getFeatureLines([(3, 5, LineType.IF, ["A", "B"]), (5, 
6, LineType.ELIF, ["A", "B", "C"])], "unittest.c")
+        self.assertSetEqual(feature_dict.get_line_info(2), set([]))
+        self.assertSetEqual(feature_dict.get_line_info(3), set(["A", "B"]))
+        self.assertSetEqual(feature_dict.get_line_info(4), set(["A", "B"]))
+        self.assertSetEqual(feature_dict.get_line_info(5), set(["A", "B", 
"C"]))
+        self.assertSetEqual(feature_dict.get_line_info(6), set(["A", "B", 
"C"]))
+        self.assertSetEqual(feature_dict.get_line_info(7), set([]))
+        pass
\ No newline at end of file
-- 
1.8.5.5


Other related posts: