1 //
2 // Copyright (c) 2010-2018 Antmicro
3 // Copyright (c) 2011-2015 Realtime Embedded
4 //
5 // This file is licensed under the MIT License.
6 // Full license text is available in 'licenses/MIT.txt'.
7 //
8 using NUnit.Framework;
9 using Antmicro.Renode.Core;
10 using System.Collections.Generic;
11 using System.Linq;
12 
13 namespace Antmicro.Renode.UnitTests.SymbolLookupTests
14 {
15     [TestFixture]
16     public class DeduplicationTests
17     {
18         [Test]
ShouldDedupliacteIdenticalSymbols()19         public void ShouldDedupliacteIdenticalSymbols()
20         {
21             var symbols = new List<Symbol>
22             {
23                 new Symbol(0, 100, "一"),
24                 new Symbol(1, 85, "四"),
25                 new Symbol(2, 70, "国"),
26                 new Symbol(80, 85, "猫"),
27                 new Symbol(3, 60, "中"),
28                 new Symbol(70, 75, "私"),
29                 new Symbol(4, 15, "五"),
30                 new Symbol(20, 35, "三"),
31             };
32             var symbolCopies = new List<Symbol>
33             {
34                 new Symbol(0, 100, "一"),
35                 new Symbol(1, 85, "四"),
36                 new Symbol(2, 70, "国"),
37                 new Symbol(80, 85, "猫"),
38                 new Symbol(3, 60, "中"),
39                 new Symbol(70, 75, "私"),
40                 new Symbol(4, 15, "五"),
41                 new Symbol(20, 35, "三"),
42             };
43             var lookup1 = new SymbolLookup();
44             var lookup2 = new SymbolLookup();
45             lookup1.InsertSymbols(symbols);
46             lookup2.InsertSymbols(symbolCopies);
47 
48             for(int i = 0; i < symbols.Count; ++i)
49             {
50                 Assert.AreSame(
51                     lookup1.GetSymbolsByName(symbols[i].Name).First(),
52                     lookup2.GetSymbolsByName(symbolCopies[i].Name).First(),
53                     string.Format("Symbol {0}, has not been deduplicated.", i)
54                 );
55             }
56         }
57 
58         [Test]
ShouldNotDedupliacteIfThereAreTwoDifferentSymbolsWithSameNameAndInterval()59         public void ShouldNotDedupliacteIfThereAreTwoDifferentSymbolsWithSameNameAndInterval()
60         {
61             var symbols1 = new List<Symbol>
62             {
63                 new Symbol(0, 100, "一"),
64                 new Symbol(20, 35, "三"),
65             };
66             var symbols2 = new List<Symbol>
67             {
68                 new Symbol(20, 35, "一"),
69             };
70             var lookup1 = new SymbolLookup();
71             var lookup2 = new SymbolLookup();
72             lookup1.InsertSymbols(symbols1);
73             lookup2.InsertSymbols(symbols2);
74 
75             var symbol = symbols1[0];
76             Assert.AreNotSame(
77                 lookup1.GetSymbolsByName(symbol.Name).First(),
78                 lookup2.GetSymbolsByName(symbol.Name).First(),
79                 string.Format("Symbol {0} has been deduplicated while it shouldn't.", symbol)
80             );
81             symbol = symbols1[1];
82             Assert.AreNotSame(
83                 lookup1.GetSymbolByAddress(symbol.Start),
84                 lookup2.GetSymbolByAddress(symbol.Start),
85                 string.Format("Symbol {0} has been deduplicated while it shouldn't.", symbol)
86             );
87         }
88 
89         [Test]
ShouldDedupliacteAfterMerge()90         public void ShouldDedupliacteAfterMerge()
91         {
92             var symbols1 = new List<Symbol>
93             {
94                 new Symbol(0, 100, "一"),
95                 new Symbol(20, 35, "三"),
96                 new Symbol(100, 105, "猫"),
97             };
98             var symbols2 = new List<Symbol>
99             {
100                 new Symbol(15, 25, "私"),
101             };
102             var lookup1 = new SymbolLookup();
103             var lookup2 = new SymbolLookup();
104             lookup1.InsertSymbols(symbols1);
105             lookup2.InsertSymbols(symbols1);
106             lookup1.InsertSymbols(symbols2);
107 
108             var symbol = symbols1[2];
109             Assert.AreSame(
110                 lookup1.GetSymbolsByName(symbol.Name).First(),
111                 lookup2.GetSymbolsByName(symbol.Name).First(),
112                 string.Format("Symbol {0} has NOT been deduplicated.", symbol)
113             );
114 
115             symbol = symbols1[1];
116             Assert.AreNotSame(
117                 lookup1.GetSymbolsByName(symbol.Name).First(),
118                 lookup2.GetSymbolsByName(symbol.Name).First(),
119                 string.Format("Symbol {0} has been deduplicated while it shouldn't.", symbol)
120             );
121         }
122     }
123 }
124 
125