source: trunk/DevTestMethods/CostFunctionTest.cs @ 1867

Last change on this file since 1867 was 1867, checked in by malischewski, 11 years ago

Tolerance problems with double comparison cleared up, has to be done this way, because of floating point arithmetic (e.g. exact comparison of two floating point values is not possible), therefore these deltas have to be used.
In my opinion this tolerance level is acceptable.

File size: 5.1 KB
Line 
1using System;
2using System.Text;
3using System.Collections.Generic;
4using System.Linq;
5using System.IO;
6using System.Reflection;
7using Microsoft.VisualStudio.TestTools.UnitTesting;
8using Cryptool.Plugins.CostFunction;
9using Cryptool.PluginBase.Cryptography;
10namespace Tests
11{
12    [TestClass]
13    public class CostFunctionTest
14    {
15        private TestContext testContextInstance;
16        public TestContext TestContext
17        {
18            get
19            {
20                return testContextInstance;
21            }
22            set
23            {
24                testContextInstance = value;
25            }
26        }
27        [TestMethod]
28        public void CostFunctionTests()
29        {
30            string input = "In der Kryptographie ist die Transposition ein Verschluesselungsverfahren, bei dem die Zeichen einer Botschaft (des Klartextes) umsortiert werden. Jedes Zeichen bleibt unveraendert erhalten, jedoch wird die Stelle, an der es steht, geaendert. Dies steht im Gegensatz zu den Verfahren der (monoalphabetischen oder polyalphabetischen) Substitution, bei denen jedes Zeichen des Klartextes seinen Platz behaelt, jedoch durch ein anderes Zeichen ersetzt (substituiert) wird.";
31            double target = 7.38051470588235;
32            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); // String to Byte Conversion
33            CostFunction cf = new CostFunction();
34           
35            //Index of Conincidence
36            cf.Initialize();
37            cf.InputText = enc.GetBytes(input);
38           
39            testContextInstance.WriteLine(enc.GetString(cf.InputText));
40            cf.changeFunctionType(0);
41            cf.PreExecution(); // important, wont work without this
42            cf.Execute();
43           
44            Assert.AreEqual(target, cf.Value, 0.00000000000001); // This _is_ close enough. => Floating point arithmetic!
45
46            //Entropy
47            target = 4.25374598691653;
48            cf.Initialize();
49            cf.InputText = enc.GetBytes(input);
50            cf.changeFunctionType(1);
51            cf.PreExecution(); 
52            cf.Execute();
53
54            Assert.AreEqual(target, cf.Value, 0.00000000000001); 
55           
56            //Bigrams: log 2
57            target = 265.318365029242;
58            string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
59            path = Environment.CurrentDirectory;
60            for (int i = 0; i < 3; i++)
61            {
62                path = System.IO.Path.GetDirectoryName(path);
63            }
64            path = Path.Combine(path, "CrypBuild\\x86\\Debug\\Data\\StatisticsCorpusDE"); // TODO: not platform specific (x64/x86)
65           
66            this.testContextInstance.WriteLine(path);
67            cf.setDataPath(path);
68            cf.Initialize();
69            cf.InputText = enc.GetBytes(input);
70            cf.changeFunctionType(2);
71            cf.PreExecution(); 
72            cf.Execute();
73            testContextInstance.WriteLine(cf.Value.ToString());
74            Assert.AreEqual(target, cf.Value, 0.000000000001); 
75
76            //Bigrams: Sinkov
77            target = -548.360297827531;
78            cf.Initialize();
79            cf.InputText = enc.GetBytes(input);
80            cf.changeFunctionType(3);
81            cf.PreExecution(); 
82            cf.Execute();
83            testContextInstance.WriteLine(cf.Value.ToString());
84            Assert.AreEqual(target, cf.Value, 0.000000000001); 
85
86            //Bigrams: Percentaged
87            target = 0.20132645541636;
88            cf.Initialize();
89            cf.InputText = enc.GetBytes(input);
90            cf.changeFunctionType(4);
91            cf.PreExecution(); 
92            cf.Execute();
93            testContextInstance.WriteLine(cf.Value.ToString());
94            Assert.AreEqual(target, cf.Value, 0.00000000000001); 
95
96            //RegEx - Match
97            target = 1.0;
98            cf.Initialize();
99            cf.InputText = enc.GetBytes(input);
100            cf.changeFunctionType(5);
101            cf.setRegEx("[^a-zA-Z0-9]"); // Alphanumeric string
102            cf.PreExecution(); 
103            cf.Execute();
104            testContextInstance.WriteLine(cf.Value.ToString());
105            Assert.AreEqual(target, cf.Value, 0.00000000000001); 
106
107            //RegEx - Not a Match
108            target = -1.0;
109            cf.Initialize();
110            cf.InputText = enc.GetBytes(input);
111            cf.changeFunctionType(5);
112            cf.setRegEx("[0-9]"); // String = Number?
113            cf.PreExecution(); 
114            cf.Execute();
115            testContextInstance.WriteLine(cf.Value.ToString());
116            Assert.AreEqual(target, cf.Value, 0.00000000000001);
117
118            //Weighted Bigrams/Trigrams
119            target = -777.230685764826;
120            cf.Initialize();
121            cf.InputText = enc.GetBytes(input);
122            cf.changeFunctionType(6);
123            cf.PreExecution(); 
124            cf.Execute();
125            testContextInstance.WriteLine(cf.Value.ToString());
126            Assert.AreEqual(target, cf.Value, 0.000000000001); 
127        }
128
129       
130    }
131}
Note: See TracBrowser for help on using the repository browser.