def test_equivalent_userid(self): node1 = PatternOneOrMoreWildCardNode("*") node2 = PatternOneOrMoreWildCardNode("*") node3 = PatternOneOrMoreWildCardNode("*", userid="testuser") self.assertTrue(node1.equivalent(node2)) self.assertFalse(node1.equivalent(node3))
def test_wildcard(self): node = PatternNode() self.assertIsNotNone(node) self.assertFalse(node.has_wildcard()) self.assertFalse(node.has_zero_or_more()) self.assertFalse(node.has_one_or_more()) node = PatternNode() node._0ormore_arrow = PatternZeroOrMoreWildCardNode("^") self.assertTrue(node.has_wildcard()) self.assertTrue(node.has_zero_or_more()) self.assertFalse(node.has_one_or_more()) node = PatternNode() node._0ormore_hash = PatternZeroOrMoreWildCardNode("#") self.assertTrue(node.has_wildcard()) self.assertTrue(node.has_zero_or_more()) self.assertFalse(node.has_one_or_more()) node = PatternNode() node._1ormore_star = PatternOneOrMoreWildCardNode("*") self.assertTrue(node.has_wildcard()) self.assertFalse(node.has_zero_or_more()) self.assertTrue(node.has_one_or_more()) node = PatternNode() node._1ormore_underline = PatternOneOrMoreWildCardNode("_") self.assertTrue(node.has_wildcard()) self.assertFalse(node.has_zero_or_more()) self.assertTrue(node.has_one_or_more())
def test_remove_all_types_children_with_userid(self): root = PatternRootNode() root.add_child(PatternPriorityWordNode("test1", userid="user1")) root.add_child(PatternWordNode("test2", userid="user1")) root.add_child(PatternZeroOrMoreWildCardNode('^', userid="user1")) root.add_child(PatternZeroOrMoreWildCardNode('#', userid="user1")) root.add_child(PatternOneOrMoreWildCardNode('_', userid="user1")) root.add_child(PatternOneOrMoreWildCardNode('*', userid="user1")) self.assertEquals(1, len(root.priority_words)) self.assertIsNotNone(root._0ormore_hash) self.assertIsNotNone(root._1ormore_underline) self.assertEquals(1, len(root.children)) self.assertIsNotNone(root._0ormore_arrow) self.assertIsNotNone(root._1ormore_star) root.remove_children_with_userid("user1") self.assertEquals(0, len(root.priority_words)) self.assertIsNone(root._0ormore_hash) self.assertIsNone(root._1ormore_underline) self.assertEquals(0, len(root.children)) self.assertIsNone(root._0ormore_arrow) self.assertIsNone(root._1ormore_star)
def test_dump_no_caller(self): global str1 node = PatternNode() self.assertIsNotNone(node) node.add_child(PatternWordNode("test")) node.add_child(PatternPriorityWordNode("pTest")) node.add_child(PatternZeroOrMoreWildCardNode("^")) node.add_child(PatternZeroOrMoreWildCardNode("#")) node.add_child(PatternOneOrMoreWildCardNode("*")) node.add_child(PatternOneOrMoreWildCardNode("_")) node.add_child(PatternTemplateNode(TemplateNode())) node.add_child(PatternSetNode({"name": "test"}, "testtext")) node.add_child(PatternISetNode({"name": "test"}, "testtext")) node.add_child(PatternBotNode({"name": "test"}, "testtext")) node.add_child(PatternRegexNode({"name": ".*"}, "testtext")) node.dump("", output_func1) self.assertEquals( "NODE [*] [P(1)^(1)#(1)C(5)_(1)*(1)To(0)Th(0)Te(1)] " "PWORD [*] [P(0)^(0)#(0)C(0)_(0)*(0)To(0)Th(0)Te(0)] word=[pTest] " "ZEROORMORE [*] [P(0)^(0)#(0)C(0)_(0)*(0)To(0)Th(0)Te(0)] wildcard=[^] " "ZEROORMORE [*] [P(0)^(0)#(0)C(0)_(0)*(0)To(0)Th(0)Te(0)] wildcard=[#] " "ONEORMORE [*] [P(0)^(0)#(0)C(0)_(0)*(0)To(0)Th(0)Te(0)] wildcard=[_] " "ONEORMORE [*] [P(0)^(0)#(0)C(0)_(0)*(0)To(0)Th(0)Te(0)] wildcard=[*] " "PTEMPLATE [*] [P(0)^(0)#(0)C(0)_(0)*(0)To(0)Th(0)Te(1)] " "WORD [*] [P(0)^(0)#(0)C(0)_(0)*(0)To(0)Th(0)Te(0)] word=[test] " "SET [*] [P(0)^(0)#(0)C(0)_(0)*(0)To(0)Th(0)Te(0)] name=[TESTTEXT] " "ISET [*] [P(0)^(0)#(0)C(0)_(0)*(0)To(0)Th(0)Te(0)] words=[TESTTEXT] " "BOT [*] [P(0)^(0)#(0)C(0)_(0)*(0)To(0)Th(0)Te(0)] property=[test] " "REGEX [*] [P(0)^(0)#(0)C(0)_(0)*(0)To(0)Th(0)Te(0)] pattern=[testtext]", str1)
def test_to_string(self): node1 = PatternOneOrMoreWildCardNode("*") self.assertEquals("ONEORMORE [*]", node1.to_string(verbose=False)) self.assertEquals("ONEORMORE [*] [P(0)^(0)#(0)C(0)_(0)*(0)To(0)Th(0)Te(0)] wildcard=[*]", node1.to_string(verbose=True)) node1 = PatternOneOrMoreWildCardNode("*", userid="testid") self.assertEquals("ONEORMORE [*]", node1.to_string(verbose=False)) self.assertEquals("ONEORMORE [testid] [P(0)^(0)#(0)C(0)_(0)*(0)To(0)Th(0)Te(0)] wildcard=[*]", node1.to_string(verbose=True))
def node_from_text(word): if word.startswith("$"): return PatternPriorityWordNode(word[1:]) elif PatternZeroOrMoreWildCardNode.is_wild_card(word): return PatternZeroOrMoreWildCardNode(word) elif PatternOneOrMoreWildCardNode.is_wild_card(word): return PatternOneOrMoreWildCardNode(word) else: return PatternWordNode(word)
def test_underline(self): node = PatternOneOrMoreWildCardNode("_") self.assertIsNotNone(node) self.assertEqual(node.wildcard, "_") self.assertTrue(node.equivalent(PatternOneOrMoreWildCardNode("_"))) self.assertEqual( node.to_string(), "ONEORMORE [P(0)^(0)#(0)C(0)_(0)*(0)To(0)Th(0)Te(0)] wildcard=[_]")
def test_one_or_more_node_exists(self): node = PatternNode() self.assertIsNotNone(node) new_node1 = PatternOneOrMoreWildCardNode("*") self.assertIsNone(node._one_or_more_node_exist(new_node1)) node.add_child(new_node1) self.assertIsNotNone(node._one_or_more_node_exist(new_node1)) new_node2 = PatternOneOrMoreWildCardNode("*", userid="testid2") self.assertIsNone(node._one_or_more_node_exist(new_node2)) node.add_child(new_node2) self.assertIsNotNone(node._one_or_more_node_exist(new_node2))
def test_to_xml(self): node1 = PatternOneOrMoreWildCardNode("*") self.assertEqual('<oneormore wildcard="*">\n</oneormore>\n', node1.to_xml(self._client_context)) self.assertEqual('<oneormore userid="*" wildcard="*">\n</oneormore>\n', node1.to_xml(self._client_context, include_user=True)) node2 = PatternOneOrMoreWildCardNode("*", userid="testid") self.assertEqual('<oneormore wildcard="*">\n</oneormore>\n', node2.to_xml(self._client_context)) self.assertEqual('<oneormore userid="testid" wildcard="*">\n</oneormore>\n', node2.to_xml(self._client_context, include_user=True))
def test_attrib_with_html(self): template = ET.fromstring(""" <template> <a target="_new" href="http://www.google.com/search?q=<star />"> Google Search </a> </template> """) conversation = Conversation(self._client_context) question = Question.create_from_text( self._client_context, "GOOGLE AIML", self._client_context.bot.sentence_splitter) question.current_sentence()._response = "OK" conversation.record_dialog(question) match = PatternOneOrMoreWildCardNode("*") context = MatchContext(max_search_depth=100, max_search_timeout=-1) context.add_match(Match(Match.WORD, match, "AIML")) question.current_sentence()._matched_context = context self._client_context.bot._conversation_mgr._conversations[ "testid"] = conversation ast = self._graph.parse_template_expression(template) self.assertIsNotNone(ast) self.assertIsInstance(ast, TemplateNode) self.assertIsNotNone(ast.children) self.assertEqual(len(ast.children), 1) xml_node = ast.children[0] self.assertIsNotNone(xml_node) self.assertIsInstance(xml_node, TemplateXMLNode) attribs = xml_node.attribs self.assertEqual(2, len(attribs)) self.assertIsInstance(attribs['target'], TemplateWordNode) target = attribs['target'] self.assertEqual(len(target.children), 0) self.assertEqual("_new", target.word) self.assertIsInstance(attribs['href'], TemplateNode) href = attribs['href'] self.assertEqual(len(href.children), 3) self.assertIsInstance(href.children[0], TemplateWordNode) self.assertEqual('http://www.google.com/search?q=', href.children[0].word) self.assertIsInstance(href.children[1], TemplateNode) self.assertEqual(1, len(href.children[1].children)) star = href.children[1].children[0] self.assertIsInstance(star, TemplateStarNode) self.assertIsInstance(href.children[2], TemplateWordNode) self.assertEqual('', href.children[2].word) result = xml_node.resolve(self._client_context) self.assertIsNotNone(result) self.assertEqual( result, '<a target="_new" href="http://www.google.com/search?q=AIML">Google Search</a>' )
def test_check_child_is_wildcard_underline(self): wildcard = MockPatternWildCardNode("*") self.assertIsNotNone(wildcard) wildcard._1ormore_underline = PatternOneOrMoreWildCardNode('_') wildcard._1ormore_underline._template = PatternTemplateNode( TemplateNode()) context = MatchContext(max_search_depth=100, max_search_timeout=-1, tokenizer=self._client_context.brain.tokenizer) sentence = Sentence(self._client_context.brain.tokenizer, "TEST SENTENCE") match = wildcard.check_child_is_wildcard("", self._client_context, context, sentence, 0, Match.WORD, 0) self.assertIsNotNone(match) context = MatchContext(max_search_depth=100, max_search_timeout=-1, tokenizer=self._client_context.brain.tokenizer) sentence = Sentence(self._client_context.brain.tokenizer, "TEST") match = wildcard.check_child_is_wildcard("", self._client_context, context, sentence, 0, Match.WORD, 0) self.assertIsNone(match)
def test_list_matches_no_template(self): global total_str topic = PatternOneOrMoreWildCardNode("*") word1 = PatternWordNode("Hi") word2 = PatternWordNode("There") context = MatchContext(max_search_depth=100, max_search_timeout=60, template_node=PatternTemplateNode( TemplateWordNode("Hello")), sentence="HELLO", response="Hi there") context.add_match(Match(Match.TOPIC, topic, None)) context.add_match(Match(Match.WORD, word1, "Hi")) context.add_match(Match(Match.WORD, word2, "There")) total_str = "" context.list_matches(self._client_context, output_func=collector, include_template=False) self.assertEquals( "\tMatches... Asked: HELLO 1: Match=(Topic) Node=(ONEORMORE [*]) Matched=() " "2: Match=(Word) Node=(WORD [Hi]) Matched=(Hi) " "3: Match=(Word) Node=(WORD [There]) Matched=(There) " "Match score 100.00", total_str)
def test_node_with_star(self): root = TemplateNode() node = TemplateStarNode() root.append(node) conversation = Conversation(self._client_context) question = Question.create_from_text( self._client_context, "Hello world", self._client_context.bot.sentence_splitter) question.current_sentence()._response = "Hello matey" conversation.record_dialog(question) question = Question.create_from_text( self._client_context, "How are you", self._client_context.bot.sentence_splitter) question.current_sentence()._response = "Very well thanks" conversation.record_dialog(question) match = PatternOneOrMoreWildCardNode("*") context = MatchContext(max_search_depth=100, max_search_timeout=-1, tokenizer=self._client_context.brain.tokenizer) context.add_match(Match(Match.WORD, match, "Matched")) question.current_sentence()._matched_context = context conversation.record_dialog(question) self._client_context.bot._conversation_mgr._conversations[ "testid"] = conversation self.assertEqual("Matched", root.resolve(self._client_context))
def setUp(self): self.parser = TemplateGraph(AIMLParser()) self.assertIsNotNone(self.parser) self.test_brain = None self.test_sentence = Sentence("test sentence") test_node = PatternOneOrMoreWildCardNode("*") self.test_sentence._matched_context = MatchContext(max_search_depth=100, max_search_timeout=-1) self.test_sentence._matched_context._matched_nodes = [Match(Match.WORD, test_node, 'one'), Match(Match.WORD, test_node, 'two'), Match(Match.WORD, test_node, 'three'), Match(Match.WORD, test_node, 'four'), Match(Match.WORD, test_node, 'five'), Match(Match.WORD, test_node, 'six'), Match(Match.TOPIC, test_node, '*'), Match(Match.THAT, test_node, '*')] test_config = ProgramyConfiguration(self.get_client_config(), brain_config=self.get_brain_config(), bot_config=self.get_bot_config()) self.test_bot = Bot(Brain(self.get_brain_config()), config=test_config.bot_configuration) self.test_clientid = "testid" conversation = self.test_bot.get_conversation(self.test_clientid) question = Question.create_from_sentence(self.test_sentence) conversation._questions.append(question)
def test_match_word(self): topic = PatternOneOrMoreWildCardNode("*") match = Match(Match.TOPIC, topic, "Hello") self.assertEqual(Match.TOPIC, match.match_type) self.assertEqual(topic, match.matched_node) self.assertEqual(["Hello"], match.matched_words) self.assertEqual("Match=(Topic) Node=(ONEORMORE [*]) Matched=(Hello)", match.to_string(self._client_context.brain.tokenizer))
def test_remove_1ormore_star(self): root = PatternRootNode() self.assertEqual(0, len(root.children)) root.add_child(PatternOneOrMoreWildCardNode("*")) self.assertIsNotNone(root._1ormore_star) root._remove_1ormore_star("*") self.assertIsNone(root._1ormore_star)
def setUp(self): self._client = TemplateGraphClient() self._client_context = self._client.create_client_context("testid") self._graph = self._client_context.bot.brain.aiml_parser.template_parser self.test_sentence = Sentence(self._client_context.brain.tokenizer, "test sentence") test_node = PatternOneOrMoreWildCardNode("*") self.test_sentence._matched_context = MatchContext( max_search_depth=100, max_search_timeout=-1, tokenizer=self._client_context.brain.tokenizer) self.test_sentence._matched_context._matched_nodes = [ Match(Match.WORD, test_node, 'one'), Match(Match.WORD, test_node, 'two'), Match(Match.WORD, test_node, 'three'), Match(Match.WORD, test_node, 'four'), Match(Match.WORD, test_node, 'five'), Match(Match.WORD, test_node, 'six'), Match(Match.TOPIC, test_node, '*'), Match(Match.THAT, test_node, '*') ] conversation = self._client_context.bot.get_conversation( self._client_context) question = Question.create_from_sentence(self.test_sentence) conversation._questions.append(question)
def test_resolve_no_defaults_inside_topic(self): root = TemplateNode() self.assertIsNotNone(root) self.assertIsNotNone(root.children) self.assertEqual(len(root.children), 0) node = TemplateTopicStarNode(index=1) self.assertIsNotNone(node) self.assertEqual(1, node.index) root.append(node) self.assertEqual(len(root.children), 1) conversation = Conversation("testid", self.bot) question = Question.create_from_text("Hello world") question.current_sentence()._response = "Hello matey" conversation.record_dialog(question) question = Question.create_from_text("How are you") question.current_sentence()._response = "Very well thanks" conversation.record_dialog(question) match = PatternOneOrMoreWildCardNode("*") context = MatchContext(max_search_depth=100, max_search_timeout=-1) context.add_match(Match(Match.TOPIC, match, "Matched")) question.current_sentence()._matched_context = context conversation.record_dialog(question) self.bot._conversations["testid"] = conversation self.assertEqual("Matched", node.resolve(self.bot, "testid"))
def test_match_word(self): topic = PatternOneOrMoreWildCardNode("*") match = Match(Match.TOPIC, topic, "Hello") self.assertEquals(Match.TOPIC, match.match_type) self.assertEquals(topic, match.matched_node) self.assertEquals(["Hello"], match.matched_words) self.assertEquals("Match=(Topic) Node=(ONEORMORE [*]) Matched=(Hello)", match.to_string())
def test_match_multi_word(self): topic = PatternOneOrMoreWildCardNode("*") match = Match(Match.TOPIC, topic, None) match.add_word("Hello") match.add_word("World") self.assertEquals(["Hello", "World"], match.matched_words) self.assertEquals("Hello World", match.joined_words()) self.assertEquals("Match=(Topic) Node=(ONEORMORE [*]) Matched=(Hello World)", match.to_string())
def test_dump_with_caller(self): node = PatternNode() self.assertIsNotNone(node) node.add_child(PatternWordNode("test")) node.add_child(PatternPriorityWordNode("pTest")) node.add_child(PatternZeroOrMoreWildCardNode("^")) node.add_child(PatternZeroOrMoreWildCardNode("#")) node.add_child(PatternOneOrMoreWildCardNode("*")) node.add_child(PatternOneOrMoreWildCardNode("_")) node.add_child(PatternTemplateNode(TemplateNode())) node.add_child(PatternSetNode({"name": "test"}, "testtext")) node.add_child(PatternISetNode({"name": "test"}, "testtext")) node.add_child(PatternBotNode({"name": "test"}, "testtext")) node.add_child(PatternRegexNode({"name": ".*"}, "testtext")) node.dump("", YLogger.debug)
def test_match_no_word(self): topic = PatternOneOrMoreWildCardNode("*") match = Match(Match.TOPIC, topic, None) self.assertEquals(Match.TOPIC, match.match_type) self.assertEquals(topic, match.matched_node) self.assertEquals([], match.matched_words) self.assertEquals("Match=(Topic) Node=(ONEORMORE [*]) Matched=()", match.to_string(self._bot.brain.tokenizer))
def test_match_no_word(self): topic = PatternOneOrMoreWildCardNode("*") match = Match(Match.TOPIC, topic, None) self.assertEqual(Match.TOPIC, match.matched_node_type) self.assertEqual(Match.TOPIC, match.matched_node_type) self.assertEqual([], match.matched_node_words) self.assertEqual("Match=(Topic) Node=(ONEORMORE [*]) Matched=()", match.to_string(self._client_context))
def test_match_context_star(self): word = PatternOneOrMoreWildCardNode("*") topic = PatternOneOrMoreWildCardNode("*") that = PatternOneOrMoreWildCardNode("*") context = MatchContext(max_search_depth=100, max_search_timeout=60) context.add_match(Match(Match.WORD, word, "Hello")) context.add_match(Match(Match.TOPIC, topic, "Hello Topic")) context.add_match(Match(Match.THAT, that, "Hello That")) self.assertEquals(3, len(context.matched_nodes)) self.assertEqual("Hello", context.star(1)) self.assertIsNone(context.star(2)) self.assertEqual("Hello Topic", context.topicstar(1)) self.assertIsNone(context.topicstar(2)) self.assertEqual("Hello That", context.thatstar(1)) self.assertIsNone(context.thatstar(2))
def test_remove_1ormore_underline_diff_users(self): root = PatternRootNode() self.assertEqual(0, len(root.children)) root.add_child(PatternOneOrMoreWildCardNode("_", "1")) self.assertIsNotNone(root._1ormore_underline) root._remove_1ormore_underline("2") self.assertIsNotNone(root._1ormore_underline) root._remove_1ormore_underline("1") self.assertIsNone(root._1ormore_underline)
def test_to_string(self): node1 = PatternOneOrMoreWildCardNode("*") self.assertEqual("ONEORMORE [*]", node1.to_string(verbose=False)) self.assertEqual( "ONEORMORE [*] [P(0)^(0)#(0)C(0)_(0)*(0)To(0)Th(0)Te(0)] wildcard=[*]", node1.to_string(verbose=True)) node1 = PatternOneOrMoreWildCardNode("*", userid="testid") self.assertEqual("ONEORMORE [*]", node1.to_string(verbose=False)) self.assertEqual( "ONEORMORE [testid] [P(0)^(0)#(0)C(0)_(0)*(0)To(0)Th(0)Te(0)] wildcard=[*]", node1.to_string(verbose=True))
def test_remove_oneormore_star_node(self): node = PatternNode() self.assertIsNotNone(node) child_node = PatternOneOrMoreWildCardNode("*") node.add_child(child_node) self.assertIsNotNone(node._1ormore_star) node._remove_node(child_node) self.assertIsNone(node._1ormore_star)
def test_match_word(self): topic = PatternOneOrMoreWildCardNode("*") match = Match(Match.TOPIC, topic, "Hello") self.assertEqual(Match.TOPIC, match.matched_node_type) self.assertTrue(match.matched_node_multi_word) self.assertTrue(match.matched_node_wildcard) self.assertEqual("ONEORMORE [*]", match.matched_node_str) self.assertEqual("Match=(Topic) Node=(ONEORMORE [*]) Matched=(Hello)", match.to_string(self._client_context)) self.assertEqual(["Hello"], match.matched_node_words)
def node_from_text(self, word, userid="*"): if word.startswith("$"): node_class = self._pattern_factory.new_node_class('priority') return node_class(word[1:], userid) elif PatternZeroOrMoreWildCardNode.is_wild_card(word): node_class = self._pattern_factory.new_node_class('zeroormore') return node_class(word, userid) elif PatternOneOrMoreWildCardNode.is_wild_card(word): node_class = self._pattern_factory.new_node_class('oneormore') return node_class(word, userid) node_class = self._pattern_factory.new_node_class('word') return node_class(word, userid)
def test_check_child_is_wildcard_star(self): wildcard = MockPatternWildCardNode("*") self.assertIsNotNone(wildcard) wildcard._1ormore_star = PatternOneOrMoreWildCardNode('*') wildcard._1ormore_star._template = PatternTemplateNode(TemplateNode()) context = MatchContext(max_search_depth=100, max_search_timeout=-1) sentence = Sentence("TEST SENTENCE") match = wildcard.check_child_is_wildcard("", self.bot, self.clientid, context, sentence, 0, Match.WORD, 0) self.assertIsNotNone(match) context = MatchContext(max_search_depth=100, max_search_timeout=-1) sentence = Sentence("TEST") match = wildcard.check_child_is_wildcard("", self.bot, self.clientid, context, sentence, 0, Match.WORD, 0) self.assertIsNone(match)
def test_match_context_pop_push(self): topic = PatternOneOrMoreWildCardNode("*") context = MatchContext(max_search_depth=100, max_search_timeout=60) context.add_match(Match(Match.TOPIC, topic, None)) self.assertEquals(1, len(context.matched_nodes)) context.add_match(Match(Match.TOPIC, topic, None)) self.assertEquals(2, len(context.matched_nodes)) context.add_match(Match(Match.TOPIC, topic, None)) self.assertEquals(3, len(context.matched_nodes)) context.pop_match() self.assertEquals(2, len(context.matched_nodes)) context.pop_match() self.assertEquals(1, len(context.matched_nodes)) context.pop_match() self.assertEquals(0, len(context.matched_nodes)) context.pop_match() self.assertEquals(0, len(context.matched_nodes))
def test_underline(self): node = PatternOneOrMoreWildCardNode("_") self.assertIsNotNone(node) self.assertFalse(node.is_root()) self.assertFalse(node.is_priority()) self.assertFalse(node.is_zero_or_more()) self.assertTrue(node.is_one_or_more()) self.assertFalse(node.is_set()) self.assertFalse(node.is_bot()) self.assertFalse(node.is_template()) self.assertFalse(node.is_that()) self.assertFalse(node.is_topic()) self.assertTrue(node.is_wildcard()) self.assertIsNotNone(node.children) self.assertFalse(node.has_children()) self.assertEqual(node.wildcard, "_") sentence = Sentence(self._client_context.brain.tokenizer, "*") self.assertTrue(node.equivalent(PatternOneOrMoreWildCardNode("_"))) result = node.equals(self._client_context, sentence, 0) self.assertFalse(result.matched) self.assertEqual(node.to_string(), "ONEORMORE [*] [P(0)^(0)#(0)C(0)_(0)*(0)To(0)Th(0)Te(0)] wildcard=[_]") self.assertEqual('<oneormore wildcard="_">\n</oneormore>\n', node.to_xml(self._client_context)) self.assertFalse(node.equivalent(PatternWordNode("test")))
def test_init(self): node = PatternOneOrMoreWildCardNode("*") self.assertIsNotNone(node) self.assertFalse(node.is_root()) self.assertFalse(node.is_priority()) self.assertTrue(node.is_wildcard()) self.assertFalse(node.is_zero_or_more()) self.assertTrue(node.is_one_or_more()) self.assertIsNotNone(node.children) self.assertFalse(node.has_children()) self.assertEqual(node.wildcard, "*") self.assertTrue(node.equivalent(PatternOneOrMoreWildCardNode("*"))) self.assertFalse(node.is_root()) self.assertEqual(node.to_string(), "ONEORMORE [P(0)^(0)#(0)C(0)_(0)*(0)To(0)Th(0)Te(0)] wildcard=[*]") node = PatternOneOrMoreWildCardNode("_") self.assertIsNotNone(node) self.assertEqual(node.wildcard, "_") self.assertTrue(node.equivalent(PatternOneOrMoreWildCardNode("_"))) self.assertFalse(node.is_root()) self.assertEqual(node.to_string(), "ONEORMORE [P(0)^(0)#(0)C(0)_(0)*(0)To(0)Th(0)Te(0)] wildcard=[_]")