public Runner(UnitTestBrowser vBrowser, EnvDTE.Project project, string ActiveConfigurationName) { Browser = vBrowser; projectname = project.UniqueName; m_Rule = TestRule.CheckProject(project); framework = m_Rule.Name; defaultpath = project.FullName.Substring( 0, project.FullName.LastIndexOf( '\\' ) ); outputpath = VCBind.GetPrimaryOutput(project, ActiveConfigurationName, m_Rule.BindType); m_bEnableBind = outputpath != null; }
private TreeNode AddTest(TreeNode projectNode, TreeNode suiteNode, string testName, string strCode, string fileName, int lineIndex, int lineEndIndex, TestRule rule) { TreeNode parentNode = suiteNode; if (parentNode == null) parentNode = projectNode; TreeNode testNode = FindByKey(parentNode.Nodes, testName); if (testNode == null) { testNode = new TreeNode(testName); SetIcon(testNode, ICON_TYPE.READY); TreeNodeTag tag = new TreeNodeTag( TREENODE_TYPE.TEST, rule.Name, testName, strCode, fileName, lineIndex, lineEndIndex ); testNode.Tag = tag; Add(parentNode.Nodes, testNode); } return testNode; }
private void Initialize() { Assembly asm = Assembly.GetExecutingAssembly(); string exePath = asm.Location; string exeRoot = exePath.Substring(0, exePath.LastIndexOf('\\')+1); string rulesPath = exeRoot + "Rules.xml"; XmlDocument doc = new XmlDocument(); try { doc.Load(rulesPath); } catch (Exception) { System.Windows.Forms.MessageBox.Show(rulesPath, "Load fail"); } foreach (XmlNode ruleNode in doc.DocumentElement.ChildNodes) { if (ruleNode.Attributes == null) continue; TestRule rule = new TestRule(ruleNode); m_TestRules.Add(rule.Name.ToUpper(), rule); } }
private TreeNode AddProject(string projectName, string projectText, TestRule rule) { if (TestList.InvokeRequired == true) { return (TreeNode)this.Invoke(new AddProjectCB(AddProject), new object[] { projectName, projectText, rule }); } TreeNode projectNode = FindByKey( TestList.Nodes, projectName ); if (projectNode == null) { projectNode = new TreeNode(projectText); SetIcon(projectNode, ICON_TYPE.READY); TreeNodeTag tag = new TreeNodeTag(TREENODE_TYPE.PROJECT, rule.Name, projectName); projectNode.Tag = tag; Add( TestList.Nodes, projectNode ); } return projectNode; }
private TreeNode AddSuite(TreeNode node, string suiteName, TestRule rule) { TreeNode suiteNode = FindByKey(node.Nodes, suiteName); if (suiteNode == null) { suiteNode = new TreeNode(suiteName); SetIcon(suiteNode, ICON_TYPE.READY); TreeNodeTag tag = new TreeNodeTag(TREENODE_TYPE.SUITE, rule.Name, suiteName); suiteNode.Tag = tag; Add(node.Nodes, suiteNode); } return suiteNode; }
private void ScanProjectItem(ProjectItem item, TreeNode projectNode, USE_DOCUMENT useDocument, TestRule rule) { TreeNode parseNode = Parse(item, useDocument, rule); if (parseNode != null && parseNode.Nodes.Count != 0) { ProcessScan(parseNode, projectNode, rule); } foreach (ProjectItem child in item.ProjectItems) { ScanProjectItem(child, projectNode, useDocument, rule); } }
private void RescanProjectItem(ProjectItem projectItem, TreeNode projectNode, TestRule rule) { Reparse(projectItem, rule, USE_DOCUMENT.AUTO); foreach (ProjectItem child in projectItem.ProjectItems) { RescanProjectItem(child, projectNode, rule); } }
private void Reparse(ProjectItem projectItem, TestRule rule, USE_DOCUMENT useDocument) { if (projectItem == null) return; Project project = projectItem.ContainingProject; if (project == null) return; TreeNode parseNode = Parse(projectItem, useDocument, rule); if (parseNode == null || parseNode.Nodes.Count == 0) { RemoveItem(projectItem); return; } string filename = projectItem.get_FileNames(1); TreeNode projectNode = FindByKey(TestList.Nodes, projectItem.ContainingProject.UniqueName); if (projectNode != null) { ProcessReparse(parseNode, projectNode, filename); ProcessScan(parseNode, projectNode, rule); ClearEmptySuite(projectNode); } }
private void ProcessScan(TreeNode parseParentNode, TreeNode parentNode, TestRule rule) { foreach (TreeNode parseNode in parseParentNode.Nodes) { TreeNodeTag tag = (TreeNodeTag)parseNode.Tag; TreeNode node = FindByKey(parentNode.Nodes, tag.key); switch (tag.type) { case TREENODE_TYPE.SUITE: { TreeNode suiteNode = null; if (node == null) suiteNode = AddSuite(parentNode, tag.key, rule); else suiteNode = node; ProcessScan(parseNode, suiteNode, rule); } break; case TREENODE_TYPE.TEST: if (node == null) { TreeNode projectNode = parentNode; while( projectNode.Parent != null ) projectNode = projectNode.Parent; TreeNode testNode = AddTest(projectNode, parentNode, tag.key, tag.code, tag.file, tag.line, tag.line_end, rule); if (parseNode.Checked == true) SelectNode(testNode); } break; } } }
private TreeNode Parse(ProjectItem item, USE_DOCUMENT useDocument, TestRule rule) { string fileName = item.get_FileNames(1); if (fileName.ToLower().EndsWith(".cpp") == false) return null; TreeNode projectNode = new TreeNode(); IParseInput pi = null; if (useDocument != USE_DOCUMENT.NOT) { IEnumerator itr = m_dte.Documents.GetEnumerator(); while( itr.MoveNext() == true ) { Document document = (Document)itr.Current; if( document != null && document.ProjectItem == item ) { TextDocument td = (TextDocument)document.Object("TextDocument"); if (td != null) { pi = new ParseInputTextDocument(td); } break; } } } if(pi == null) pi = new ParseInputFile(fileName); TreeNode suiteNode = null, testNode = null; int lineIndex = 1; string strLine; int suiteBraceCount = 0, testBraceCount = 0; char[] trimFilter = { ' ', '\r', '\n', '\t' }; char[] commands = { '{', '}', '\"', '\'', '/', '(' }; char[] commandsSeperator = { ',', ')' }; char command = '\0'; bool bProcessString = false, bProcessComment = false; while ((strLine = pi.GetLine()) != null) { int index = 0; while (index != -1 && ((command != '\0' && (index = strLine.IndexOf(command, index)) != -1) || (command == '\0' && (index = strLine.IndexOfAny(commands, index)) != -1))) { command = strLine[index]; if( bProcessComment == false || command == '/' ) { switch (command) { case '\"': case '\'': if (bProcessString == true) { command = '\0'; bProcessString = false; } else bProcessString = true; break; case '/': if (index + 1 < strLine.Length && strLine[index + 1] == '/') { index = -1; command = '\0'; } else if (index > 0 && strLine[index - 1] == '*') { if (bProcessComment == false) { pi.Release(); return null; } bProcessComment = false; command = '\0'; } else if (index + 1 < strLine.Length && strLine[index + 1] == '*') bProcessComment = true; else command = '\0'; break; case '{': if (rule.SuiteType == SUITE_TYPE.BRACE && suiteNode != null) suiteBraceCount++; if (testNode != null) testBraceCount++; command = '\0'; break; case '}': if( rule.SuiteType == SUITE_TYPE.BRACE && suiteNode != null ) { if (--suiteBraceCount == 0) suiteNode = null; } if( testNode != null ) { if (--testBraceCount == 0) { TreeNodeTag tag = (TreeNodeTag)testNode.Tag; tag.line_end = lineIndex; testNode.Tag = tag; testNode = null; } } command = '\0'; break; case '(': { string strCommand = strLine.Substring(0, index).Trim(trimFilter); int keyIndex = rule.Keywords.IndexOfKey(strCommand); if( keyIndex != -1 ) { TestKeyword keyword = (TestKeyword)rule.Keywords.GetByIndex(keyIndex); ArrayList commandNames = new ArrayList(); while( strLine[index] != ')' ) { int newIndex = strLine.IndexOfAny(commandsSeperator, index + 1); if (newIndex == -1) { pi.Release(); return null; } commandNames.Add( strLine.Substring(index + 1, newIndex - index - 1).Trim(trimFilter) ); index = newIndex; } switch(keyword.Type) { case TESTKEYWORD_TYPE.SUITE: if (rule.SuiteType == SUITE_TYPE.BRACE) suiteNode = AddSuite(projectNode, (string)commandNames[keyword.NameIndex], rule); break; case TESTKEYWORD_TYPE.SUITE_BEGIN: if (rule.SuiteType == SUITE_TYPE.BEGIN_END) suiteNode = AddSuite(projectNode, (string)commandNames[keyword.NameIndex], rule); break; case TESTKEYWORD_TYPE.SUITE_END: if (rule.SuiteType == SUITE_TYPE.BEGIN_END) suiteNode = null; break; case TESTKEYWORD_TYPE.TEST: switch( rule.SuiteType ) { case SUITE_TYPE.NOT_USE: testNode = AddTest(projectNode, null, (string)commandNames[keyword.NameIndex], strLine.Trim(), fileName, lineIndex, -1, rule); break; case SUITE_TYPE.WITH_TEST: suiteNode = AddSuite(projectNode, (string)commandNames[keyword.SuiteIndex], rule); testNode = AddTest(projectNode, suiteNode, (string)commandNames[keyword.NameIndex], strLine.Trim(), fileName, lineIndex, -1, rule); suiteNode = null; break; default: if( suiteNode == null ) suiteNode = AddSuite(projectNode, "DefaultSuite", rule); testNode = AddTest(projectNode, suiteNode, (string)commandNames[keyword.NameIndex], strLine.Trim(), fileName, lineIndex, -1, rule); break; } break; } } command = '\0'; } break; } } if (index != -1) index++; } lineIndex++; } pi.Release(); return projectNode; }