def test_adder_node(self):
     attr = model.FileAttr(path=self.test_words_path)
     node = model.AddNode(prepend=True)
     node.add_attr(attr)
     result = list(node.get_words(['A', 'B']))
     self.assertEqual(result, ['test1A', 'test word 2A', 'THIRDTESTWORDA',
                               'test1B', 'test word 2B', 'THIRDTESTWORDB'])
     self.assertEqual(len(result), node.count_words(2))
     
     attr = model.FileAttr(path=self.test_words_path)
     node = model.AddNode(prepend=False)
     node.add_attr(attr)
     result = list(node.get_words(['A', 'B']))
     self.assertEqual(result, ['Atest1', 'Atest word 2', 'ATHIRDTESTWORD',
                               'Btest1', 'Btest word 2', 'BTHIRDTESTWORD'])
     self.assertEqual(len(result), node.count_words(2))
                               
     attr = model.FileAttr(path=self.test_words_path)
     node = model.AddNode(prepend=True)
     node.add_attr(attr)
     attr = model.NothingAdderAttr()
     node.add_attr(attr)
     result = list(node.get_words(['A', 'B']))
     self.assertEqual(result, ['test1A', 'test word 2A', 'THIRDTESTWORDA', 'A',
                               'test1B', 'test word 2B', 'THIRDTESTWORDB', 'B'])
     self.assertEqual(len(result), node.count_words(2))
                               
     node = model.AddNode(prepend=True)
     result = list(node.get_words(['A', 'B']))
     self.assertEqual(result, ['A', 'B'])
     self.assertEqual(len(result), node.count_words(2))
 def test_empty_add_case_chain(self):
     chain = model.Chain()
     
     basewords = ['hello', 'world']
     node = model.BaseNode(is_root=True)
     attr = model.StringListAttr(strings=basewords)
     node.add_attr(attr)
     chain.add_node(node)
     
     node = model.AddNode()
     chain.add_node(node)
     
     node = model.MutateNode(is_case=True)
     attr = model.CaseAttr(type_='First', case='Uppercase')
     node.add_attr(attr)
     chain.add_node(node)
     
     truth_words = ['Hello', 'World']
     result = list(chain.get_words())
     self.assertEqual(sorted(truth_words), sorted(result))
     self.assertEqual(len(basewords), chain.count_words())
     self.assertEqual(len('\n'.join(result)+'\n'), chain.count_bytes())
     
     rules = chain.get_rules()
     self.assert_hashcat_result(sorted(truth_words), rules, basewords=basewords)
     self.assertTrue(chain.check_hashcat_compatible())
 
     self.assertEqual(':c\n', rules)
    def test_append_nothing_chain(self):
        chain = model.Chain()
        
        basewords = ['heLlo', 'worLd']
        node = model.BaseNode(is_root=True)
        attr = model.StringListAttr(strings=basewords)
        node.add_attr(attr)
        chain.add_node(node)
        
        node = model.AddNode(prepend=False)
        node.add_attr(model.StringListAttr(strings=['A', 'B']))
        node.add_attr(model.NothingAdderAttr())
        chain.add_node(node)
        
        truth_words = ['heLlo', 'heLloA', 'heLloB', 'worLd', 'worLdA', 'worLdB']
        result = list(chain.get_words())
        self.assertEqual(sorted(result), sorted(truth_words))
        self.assertEqual(len(result), chain.count_words())
    
        rules = chain.get_rules()
        self.assert_hashcat_result(truth_words, rules, basewords)
        self.assertTrue(chain.check_hashcat_compatible())
        rules_truth = '''$A
$B
:
'''
        self.assertEqual(rules_truth, rules)
    def test_add_chain(self):
        chain = model.Chain()
        
        basewords = ['heLlo', 'worLd']
        node = model.BaseNode(is_root=True)
        attr = model.StringListAttr(strings=basewords)
        node.add_attr(attr)
        chain.add_node(node)
        
        node = model.AddNode(prepend=False)
        node.add_attr(model.FileAttr(path=self.test_words_path))
        chain.add_node(node)
        
        node = model.AddNode(prepend=False)
        node.add_attr(model.StringListAttr(strings=['A', 'B']))
        node.add_attr(model.NothingAdderAttr())
        chain.add_node(node)
        
        truth_words = ['heLlotest1A', 'heLlotest1B', 'heLlotest1', 'heLlotest word 2A', 'heLlotest word 2B', 'heLlotest word 2', 'heLloTHIRDTESTWORDA', 'heLloTHIRDTESTWORDB', 'heLloTHIRDTESTWORD', 'worLdtest1A', 'worLdtest1B', 'worLdtest1', 'worLdtest word 2A', 'worLdtest word 2B', 'worLdtest word 2', 'worLdTHIRDTESTWORDA', 'worLdTHIRDTESTWORDB', 'worLdTHIRDTESTWORD']
        result = list(chain.get_words())
        self.assertEqual(sorted(result), sorted(truth_words))
        self.assertEqual(len(result), chain.count_words())
    
        rules = chain.get_rules()
        self.assert_hashcat_result(truth_words, rules, basewords)
        self.assertTrue(chain.check_hashcat_compatible())
    
        rules_truth = '''$t$e$s$t$1$A
$t$e$s$t$ $w$o$r$d$ $2$A
$T$H$I$R$D$T$E$S$T$W$O$R$D$A
$t$e$s$t$1$B
$t$e$s$t$ $w$o$r$d$ $2$B
$T$H$I$R$D$T$E$S$T$W$O$R$D$B
$t$e$s$t$1:
$t$e$s$t$ $w$o$r$d$ $2:
$T$H$I$R$D$T$E$S$T$W$O$R$D:
'''
        self.assertEqual(rules_truth, rules)
    def test_nothing_basenode_chain(self):
        chain = model.Chain()
    
        node = model.BaseNode(is_root=True)
        attr = model.NothingAdderAttr()
        node.add_attr(attr)
        chain.add_node(node)

        node = model.AddNode(prepend=True)
        range_ = [5, 10]
        attr = model.RangeAttr(start=range_[0], end=range_[1])
        node.add_attr(attr)
        chain.add_node(node)
        
        result = list(chain.get_words())
        truth = list(map(str, range(*range_)))
        self.assertEqual(sorted(result), sorted(truth))
        self.assertEqual(len(result), chain.count_words())
        self.assertEqual(len('\n'.join(result)+'\n'), chain.count_bytes())
        self.assertTrue(chain.check_hashcat_compatible())
     node.add_attr(attr)
     chain.add_node(node)
     
     node = model.MutateNode(is_case=True)
     node.add_attr(model.CaseAttr(type_='First', case='Uppercase'))
     node.add_attr(model.CaseAttr(type_='All', case='Lowercase'))
     node.add_attr(model.NothingMutatorAttr())
     chain.add_node(node)
     
     node = model.MutateNode()
     attr = model.SubstitutionAttr(type_='All', checked_vals=['l -> i', 'l -> 1', 'd -> b'], all_together=False)
     #node.add_attr(model.NothingMutatorAttr()) # differs from hashcat when this is missing
     node.add_attr(attr)
     chain.add_node(node)
     
     node = model.AddNode()
     node.add_attr(model.RangeAttr(0, 3))
     chain.add_node(node)
     
     truth_words = [#'Hello', 'heLlo', 'hello', 'World', 'worLd', 'world',
                    'Heiio0', 'heiio0', 'Heiio1', 'heiio1', 'Heiio2', 'heiio2',
                    'He11o0', 'he11o0', 'He11o1', 'he11o1', 'He11o2', 'he11o2',
                    'Worid0', 'worid0', 'Worid1', 'worid1', 'Worid2', 'worid2',
                    'Wor1d0', 'wor1d0', 'Wor1d1', 'wor1d1', 'Wor1d2', 'wor1d2',
                    'Worlb0', 'worLb0', 'Worlb1', 'worLb1', 'Worlb2', 'worLb2',
                    'worlb0', 'worlb1', 'worlb2']
     result = list(chain.get_words())
     self.assertEqual(sorted(truth_words), sorted(set(result)))
     #self.assertEqual(9, chain.count_words())
     #self.assertEqual(len('\n'.join(result)+'\n'), chain.count_bytes())