5
// Lluis Sanchez Gual <lluis@novell.com>
7
// Copyright (c) 2009 Novell, Inc (http://www.novell.com)
9
// Permission is hereby granted, free of charge, to any person obtaining a copy
10
// of this software and associated documentation files (the "Software"), to deal
11
// in the Software without restriction, including without limitation the rights
12
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
// copies of the Software, and to permit persons to whom the Software is
14
// furnished to do so, subject to the following conditions:
16
// The above copyright notice and this permission notice shall be included in
17
// all copies or substantial portions of the Software.
19
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
28
using Mono.Debugging.Client;
29
using NUnit.Framework;
31
namespace MonoDevelop.Debugger.Tests
33
public abstract class EvaluationTests: DebugTests
38
public EvaluationTests (string de): base (de)
42
public override void Setup ()
45
ds = Start ("TestEvaluation");
46
frame = ds.ActiveThread.Backtrace.GetFrame (0);
49
public override void TearDown ()
57
ObjectValue Eval (string exp)
59
return frame.GetExpressionValue (exp, true).Sync ();
65
ObjectValue val = Eval ("this");
66
Assert.AreEqual ("{MonoDevelop.Debugger.Tests.TestApp.MainClass}", val.Value);
67
Assert.AreEqual ("MonoDevelop.Debugger.Tests.TestApp.MainClass", val.TypeName);
71
public void UnaryOperators ()
73
ObjectValue val = Eval ("~1234");
74
Assert.AreEqual ((~1234).ToString (), val.Value);
75
Assert.AreEqual ("int", val.TypeName);
78
Assert.AreEqual ("false", val.Value);
79
Assert.AreEqual ("bool", val.TypeName);
81
val = Eval ("!false");
82
Assert.AreEqual ("true", val.Value);
83
Assert.AreEqual ("bool", val.TypeName);
86
Assert.AreEqual ("-1234", val.Value);
87
Assert.AreEqual ("int", val.TypeName);
90
Assert.AreEqual ("1234", val.Value);
91
Assert.AreEqual ("int", val.TypeName);
95
public void TypeReference ()
97
ObjectValue val = Eval ("System.String");
98
Assert.AreEqual ("string", val.Value);
99
Assert.AreEqual ("<type>", val.TypeName);
100
Assert.AreEqual (ObjectValueFlags.Type, val.Flags & ObjectValueFlags.OriginMask);
102
val = Eval ("MainClass");
103
Assert.AreEqual ("MonoDevelop.Debugger.Tests.TestApp.MainClass", val.Value);
104
Assert.AreEqual ("<type>", val.TypeName);
105
Assert.AreEqual (ObjectValueFlags.Type, val.Flags & ObjectValueFlags.OriginMask);
107
val = Eval ("MonoDevelop.Debugger.Tests.TestApp.MainClass");
108
Assert.AreEqual ("MonoDevelop.Debugger.Tests.TestApp.MainClass", val.Value);
109
Assert.AreEqual ("<type>", val.TypeName);
110
Assert.AreEqual (ObjectValueFlags.Type, val.Flags & ObjectValueFlags.OriginMask);
114
public virtual void TypeReferenceGeneric ()
116
ObjectValue val = Eval ("System.Collections.Generic.Dictionary<string,int>");
117
Assert.AreEqual ("System.Collections.Generic.Dictionary<string,int>", val.Value);
118
Assert.AreEqual ("<type>", val.TypeName);
119
Assert.AreEqual (ObjectValueFlags.Type, val.Flags & ObjectValueFlags.OriginMask);
123
public virtual void Typeof ()
125
ObjectValue val = Eval ("typeof(System.Console)");
126
Assert.IsTrue (val.TypeName == "System.MonoType" || val.TypeName == "System.RuntimeType", "Incorrect type name: " + val.TypeName);
127
Assert.AreEqual ("{System.Console}", val.Value);
131
public void MethodInvoke ()
134
val = Eval ("TestMethod ()");
135
Assert.AreEqual ("1", val.Value);
136
Assert.AreEqual ("int", val.TypeName);
138
val = Eval ("TestMethod (\"23\")");
139
Assert.AreEqual ("24", val.Value);
140
Assert.AreEqual ("int", val.TypeName);
142
val = Eval ("TestMethod (42)");
143
Assert.AreEqual ("43", val.Value);
144
Assert.AreEqual ("int", val.TypeName);
146
val = Eval ("TestMethod (false)");
147
Assert.AreEqual ("2", val.Value);
148
Assert.AreEqual ("int", val.TypeName);
150
val = Eval ("this.TestMethod ()");
151
Assert.AreEqual ("1", val.Value);
152
Assert.AreEqual ("int", val.TypeName);
154
val = Eval ("this.TestMethod (\"23\")");
155
Assert.AreEqual ("24", val.Value);
156
Assert.AreEqual ("int", val.TypeName);
158
val = Eval ("this.TestMethod (42)");
159
Assert.AreEqual ("43", val.Value);
160
Assert.AreEqual ("int", val.TypeName);
162
val = Eval ("System.Int32.Parse (\"67\")");
163
Assert.AreEqual ("67", val.Value);
164
Assert.AreEqual ("int", val.TypeName);
166
val = Eval ("this.BoxingTestMethod (43)");
167
Assert.AreEqual ("\"43\"", val.Value);
168
Assert.AreEqual ("string", val.TypeName);
172
public void Indexers ()
174
ObjectValue val = Eval ("numbers[0]");
175
Assert.AreEqual ("\"one\"", val.Value);
176
Assert.AreEqual ("string", val.TypeName);
178
val = Eval ("numbers[1]");
179
Assert.AreEqual ("\"two\"", val.Value);
180
Assert.AreEqual ("string", val.TypeName);
182
val = Eval ("numbers[2]");
183
Assert.AreEqual ("\"three\"", val.Value);
184
Assert.AreEqual ("string", val.TypeName);
186
val = Eval ("staticString[2]");
187
Assert.AreEqual ("'m'", val.Value);
188
Assert.AreEqual ("char", val.TypeName);
190
val = Eval ("alist[0]");
191
Assert.AreEqual ("1", val.Value);
192
Assert.AreEqual ("int", val.TypeName);
194
val = Eval ("alist[1]");
195
Assert.AreEqual ("\"two\"", val.Value);
196
Assert.AreEqual ("string", val.TypeName);
198
val = Eval ("alist[2]");
199
Assert.AreEqual ("3", val.Value);
200
Assert.AreEqual ("int", val.TypeName);
204
public void MemberReference ()
206
ObjectValue val = Eval ("alist.Count");
207
Assert.AreEqual ("3", val.Value);
208
Assert.AreEqual ("int", val.TypeName);
210
Eval ("var tt = this");
212
val = Eval ("tt.someString");
213
Assert.AreEqual ("\"hi\"", val.Value);
214
Assert.AreEqual ("string", val.TypeName);
216
val = Eval ("MonoDevelop.Debugger.Tests");
217
Assert.AreEqual ("MonoDevelop.Debugger.Tests", val.Value);
218
Assert.AreEqual ("<namespace>", val.TypeName);
220
val = Eval ("MonoDevelop.Debugger.Tests.TestApp.MainClass");
221
Assert.AreEqual ("MonoDevelop.Debugger.Tests.TestApp.MainClass", val.Value);
222
Assert.AreEqual ("<type>", val.TypeName);
224
val = Eval ("MonoDevelop.Debugger.Tests.TestApp.MainClass.staticString");
225
Assert.AreEqual ("\"some static\"", val.Value);
226
Assert.AreEqual ("string", val.TypeName);
230
public void ConditionalExpression ()
232
ObjectValue val = Eval ("true ? \"yes\" : \"no\"");
233
Assert.AreEqual ("\"yes\"", val.Value);
234
Assert.AreEqual ("string", val.TypeName);
236
val = Eval ("false ? \"yes\" : \"no\"");
237
Assert.AreEqual ("\"no\"", val.Value);
238
Assert.AreEqual ("string", val.TypeName);
245
val = Eval ("(byte)n");
246
Assert.AreEqual ("32", val.Value);
247
Assert.AreEqual ("byte", val.TypeName);
249
val = Eval ("(int)n");
250
Assert.AreEqual ("32", val.Value);
251
Assert.AreEqual ("int", val.TypeName);
253
val = Eval ("(long)n");
254
Assert.AreEqual ("32", val.Value);
255
Assert.AreEqual ("long", val.TypeName);
257
val = Eval ("(float)n");
258
Assert.AreEqual ("32", val.Value);
259
Assert.AreEqual ("float", val.TypeName);
261
val = Eval ("(double)n");
262
Assert.AreEqual ("32", val.Value);
263
Assert.AreEqual ("double", val.TypeName);
265
val = Eval ("(string)staticString");
266
Assert.AreEqual ("\"some static\"", val.Value);
267
Assert.AreEqual ("string", val.TypeName);
269
val = Eval ("(int)numbers");
270
Assert.IsTrue (val.IsError);
272
val = Eval ("(int)this");
273
Assert.IsTrue (val.IsError);
276
Assert.IsTrue (val.IsError);
279
Assert.IsTrue (val.IsError);
282
Assert.AreEqual ("{C}", val.Value);
283
Assert.AreEqual ("C", val.TypeName);
286
Assert.IsTrue (val.IsError);
289
Assert.AreEqual ("{B}", val.Value);
290
Assert.AreEqual ("B", val.TypeName);
293
Assert.AreEqual ("{C}", val.Value);
294
Assert.AreEqual ("C", val.TypeName);
297
Assert.AreEqual ("{A}", val.Value);
298
Assert.AreEqual ("A", val.TypeName);
301
Assert.AreEqual ("{B}", val.Value);
302
Assert.AreEqual ("B", val.TypeName);
305
Assert.AreEqual ("{C}", val.Value);
306
Assert.AreEqual ("C", val.TypeName);
310
val = Eval ("c as A");
311
Assert.AreEqual ("{C}", val.Value);
312
Assert.AreEqual ("C", val.TypeName);
314
val = Eval ("c as B");
315
Assert.AreEqual ("{C}", val.Value);
316
Assert.AreEqual ("C", val.TypeName);
318
val = Eval ("c as C");
319
Assert.AreEqual ("{C}", val.Value);
320
Assert.AreEqual ("C", val.TypeName);
322
val = Eval ("b as A");
323
Assert.AreEqual ("{B}", val.Value);
324
Assert.AreEqual ("B", val.TypeName);
326
val = Eval ("b as B");
327
Assert.AreEqual ("{B}", val.Value);
328
Assert.AreEqual ("B", val.TypeName);
330
val = Eval ("b as C");
331
Assert.AreEqual ("null", val.Value);
332
Assert.AreEqual ("C", val.TypeName);
334
val = Eval ("a as A");
335
Assert.AreEqual ("{A}", val.Value);
336
Assert.AreEqual ("A", val.TypeName);
338
val = Eval ("a as B");
339
Assert.AreEqual ("null", val.Value);
340
Assert.AreEqual ("B", val.TypeName);
342
val = Eval ("a as C");
343
Assert.AreEqual ("null", val.Value);
344
Assert.AreEqual ("C", val.TypeName);
348
val = Eval ("(int)SomeEnum.two");
349
Assert.AreEqual ("2", val.Value);
350
Assert.AreEqual ("int", val.TypeName);
352
val = Eval ("(long)SomeEnum.two");
353
Assert.AreEqual ("2", val.Value);
354
Assert.AreEqual ("long", val.TypeName);
356
val = Eval ("(SomeEnum)2");
357
Assert.AreEqual ("SomeEnum.two", val.Value);
358
Assert.AreEqual ("two", val.DisplayValue);
359
Assert.AreEqual ("SomeEnum", val.TypeName);
361
val = Eval ("(SomeEnum)3");
362
Assert.AreEqual ("SomeEnum.one|SomeEnum.two", val.Value);
363
Assert.AreEqual ("one|two", val.DisplayValue);
364
Assert.AreEqual ("SomeEnum", val.TypeName);
368
public void BinaryOperators ()
374
val = Eval ("true && true");
375
Assert.AreEqual ("true", val.Value);
376
Assert.AreEqual ("bool", val.TypeName);
378
val = Eval ("true && false");
379
Assert.AreEqual ("false", val.Value);
380
Assert.AreEqual ("bool", val.TypeName);
382
val = Eval ("false && true");
383
Assert.AreEqual ("false", val.Value);
384
Assert.AreEqual ("bool", val.TypeName);
386
val = Eval ("false && false");
387
Assert.AreEqual ("false", val.Value);
388
Assert.AreEqual ("bool", val.TypeName);
390
val = Eval ("false || false");
391
Assert.AreEqual ("false", val.Value);
392
Assert.AreEqual ("bool", val.TypeName);
394
val = Eval ("false || true");
395
Assert.AreEqual ("true", val.Value);
396
Assert.AreEqual ("bool", val.TypeName);
398
val = Eval ("true || false");
399
Assert.AreEqual ("true", val.Value);
400
Assert.AreEqual ("bool", val.TypeName);
402
val = Eval ("true || true");
403
Assert.AreEqual ("true", val.Value);
404
Assert.AreEqual ("bool", val.TypeName);
406
val = Eval ("false || 1");
407
Assert.IsTrue (val.IsError);
409
val = Eval ("1 || true");
410
Assert.IsTrue (val.IsError);
412
val = Eval ("true && 1");
413
Assert.IsTrue (val.IsError);
415
val = Eval ("1 && true");
416
Assert.IsTrue (val.IsError);
420
val = Eval ("\"a\" + \"b\"");
421
Assert.AreEqual ("\"ab\"", val.Value);
422
Assert.AreEqual ("string", val.TypeName);
424
val = Eval ("\"a\" + 2");
425
Assert.AreEqual ("\"a2\"", val.Value);
426
Assert.AreEqual ("string", val.TypeName);
428
val = Eval ("2 + \"a\"");
429
Assert.AreEqual ("\"2a\"", val.Value);
430
Assert.AreEqual ("string", val.TypeName);
432
val = Eval ("this + \"a\"");
433
Assert.AreEqual ("\"MonoDevelop.Debugger.Tests.TestApp.MainClassa\"", val.Value);
434
Assert.AreEqual ("string", val.TypeName);
438
val = Eval ("2 == 2");
439
Assert.AreEqual ("true", val.Value);
440
Assert.AreEqual ("bool", val.TypeName);
442
val = Eval ("2 == 3");
443
Assert.AreEqual ("false", val.Value);
444
Assert.AreEqual ("bool", val.TypeName);
446
val = Eval ("(long)2 == (int)2");
447
Assert.AreEqual ("true", val.Value);
448
Assert.AreEqual ("bool", val.TypeName);
452
val = Eval ("2 + 3");
453
Assert.AreEqual ("5", val.Value);
455
val = Eval ("2 + 2 == 4");
456
Assert.AreEqual ("true", val.Value);
457
Assert.AreEqual ("bool", val.TypeName);
461
public virtual void Assignment ()
466
Assert.AreEqual ("6", val.Value);
467
Assert.AreEqual ("int", val.TypeName);
470
Assert.AreEqual ("32", val.Value);
472
Eval ("someString = \"test\"");
473
val = Eval ("someString");
474
Assert.AreEqual ("\"test\"", val.Value);
475
Assert.AreEqual ("string", val.TypeName);
476
Eval ("someString = \"hi\"");
477
val = Eval ("someString");
478
Assert.AreEqual ("\"hi\"", val.Value);
480
Eval ("numbers[0] = \"test\"");
481
val = Eval ("numbers[0]");
482
Assert.AreEqual ("\"test\"", val.Value);
483
Assert.AreEqual ("string", val.TypeName);
484
Eval ("numbers[0] = \"one\"");
485
val = Eval ("numbers[0]");
486
Assert.AreEqual ("\"one\"", val.Value);
488
Eval ("alist[0] = 6");
489
val = Eval ("alist[0]");
490
Assert.AreEqual ("6", val.Value);
491
Assert.AreEqual ("int", val.TypeName);
492
Eval ("alist[0] = 1");
493
val = Eval ("alist[0]");
494
Assert.AreEqual ("1", val.Value);
498
public virtual void AssignmentStatic ()
502
Eval ("staticString = \"test\"");
503
val = Eval ("staticString");
504
Assert.AreEqual ("\"test\"", val.Value);
505
Assert.AreEqual ("string", val.TypeName);
506
Eval ("staticString = \"some static\"");
507
val = Eval ("staticString");
508
Assert.AreEqual ("\"some static\"", val.Value);
512
public void FormatBool ()
516
Assert.AreEqual ("true", val.Value);
517
val = Eval ("false");
518
Assert.AreEqual ("false", val.Value);
522
public void FormatNumber ()
525
val = Eval ("(int)123");
526
Assert.AreEqual ("123", val.Value);
527
val = Eval ("(int)-123");
528
Assert.AreEqual ("-123", val.Value);
530
val = Eval ("(long)123");
531
Assert.AreEqual ("123", val.Value);
532
val = Eval ("(long)-123");
533
Assert.AreEqual ("-123", val.Value);
535
val = Eval ("(byte)123");
536
Assert.AreEqual ("123", val.Value);
538
val = Eval ("(uint)123");
539
Assert.AreEqual ("123", val.Value);
541
val = Eval ("(ulong)123");
542
Assert.AreEqual ("123", val.Value);
545
Assert.AreEqual ("123.456", val.Value);
549
public void FormatString ()
552
val = Eval ("\"hi\"");
553
Assert.AreEqual ("\"hi\"", val.Value);
555
val = Eval ("EscapedStrings");
556
Assert.AreEqual ("\" \\\" \\\\ \\a \\b \\f \\v \\n \\r \\t\"", val.Value);
558
val = Eval ("\" \\\" \\\\ \\a \\b \\f \\v \\n \\r \\t\"");
559
Assert.AreEqual ("\" \\\" \\\\ \\a \\b \\f \\v \\n \\r \\t\"", val.Value);
563
public void FormatChar ()
567
Assert.AreEqual ("'A'", val.Value);
568
Assert.AreEqual ("65 'A'", val.DisplayValue);
570
val = Eval ("'\\0'");
571
Assert.AreEqual ("'\\0'", val.Value);
572
Assert.AreEqual ("0 '\\0'", val.DisplayValue);
575
Assert.AreEqual ("'\"'", val.Value);
576
Assert.AreEqual ("34 '\"'", val.DisplayValue);
578
val = Eval ("'\\''");
579
Assert.AreEqual ("'\\''", val.Value);
580
Assert.AreEqual ("39 '\\''", val.DisplayValue);
582
val = Eval ("'\\\\'");
583
Assert.AreEqual ("'\\\\'", val.Value);
584
Assert.AreEqual ("92 '\\\\'", val.DisplayValue);
586
val = Eval ("'\\a'");
587
Assert.AreEqual ("'\\a'", val.Value);
588
Assert.AreEqual ("7 '\\a'", val.DisplayValue);
590
val = Eval ("'\\b'");
591
Assert.AreEqual ("'\\b'", val.Value);
592
Assert.AreEqual ("8 '\\b'", val.DisplayValue);
594
val = Eval ("'\\f'");
595
Assert.AreEqual ("'\\f'", val.Value);
596
Assert.AreEqual ("12 '\\f'", val.DisplayValue);
598
val = Eval ("'\\v'");
599
Assert.AreEqual ("'\\v'", val.Value);
600
Assert.AreEqual ("11 '\\v'", val.DisplayValue);
602
val = Eval ("'\\n'");
603
Assert.AreEqual ("'\\n'", val.Value);
604
Assert.AreEqual ("10 '\\n'", val.DisplayValue);
606
val = Eval ("'\\r'");
607
Assert.AreEqual ("'\\r'", val.Value);
608
Assert.AreEqual ("13 '\\r'", val.DisplayValue);
610
val = Eval ("'\\t'");
611
Assert.AreEqual ("'\\t'", val.Value);
612
Assert.AreEqual ("9 '\\t'", val.DisplayValue);
616
public void FormatObject ()
621
Assert.AreEqual ("{C}", val.Value);
622
Assert.AreEqual ("C", val.TypeName);
624
val = Eval ("withDisplayString");
625
Assert.AreEqual ("Some one Value 2 End", val.Value);
626
Assert.AreEqual ("WithDisplayString", val.TypeName);
628
val = Eval ("withProxy");
629
Assert.AreEqual ("{WithProxy}", val.Value);
630
Assert.AreEqual ("WithProxy", val.TypeName);
632
/* val = Eval ("withToString");
633
Assert.AreEqual ("{SomeString}", val.Value);
634
Assert.AreEqual ("WithToString", val.TypeName);*/
638
public void FormatArray ()
642
val = Eval ("numbers");
643
Assert.AreEqual ("{string[3]}", val.Value);
644
Assert.AreEqual ("string[]", val.TypeName);
646
val = Eval ("numbersArrays");
647
Assert.AreEqual ("{int[2][]}", val.Value);
648
Assert.AreEqual ("int[][]", val.TypeName);
650
val = Eval ("numbersMulti");
651
Assert.AreEqual ("{int[3,4,5]}", val.Value);
652
Assert.AreEqual ("int[,,]", val.TypeName);
656
public void FormatGeneric ()
660
ds.Options.EvaluationOptions.AllowTargetInvoke = false;
662
ds.Options.EvaluationOptions.AllowTargetInvoke = true;
663
Assert.AreEqual ("{System.Collections.Generic.Dictionary<int,string[]>}", val.Value);
664
Assert.AreEqual ("System.Collections.Generic.Dictionary<int,string[]>", val.TypeName);
666
ds.Options.EvaluationOptions.AllowTargetInvoke = false;
667
val = Eval ("dictArray");
668
ds.Options.EvaluationOptions.AllowTargetInvoke = true;
669
Assert.AreEqual ("{System.Collections.Generic.Dictionary<int,string[]>[2,3]}", val.Value);
670
Assert.AreEqual ("System.Collections.Generic.Dictionary<int,string[]>[,]", val.TypeName);
672
val = Eval ("thing.done");
673
Assert.AreEqual ("{Thing<string>.Done<int>[1]}", val.Value);
674
Assert.AreEqual ("Thing<string>.Done<int>[]", val.TypeName);
677
Assert.AreEqual ("{Thing<string>.Done<int>}", val.Value);
678
Assert.AreEqual ("Thing<string>.Done<int>", val.TypeName);
682
public void FormatEnum ()
686
val = Eval ("SomeEnum.one");
687
Assert.AreEqual ("SomeEnum.one", val.Value);
688
Assert.AreEqual ("one", val.DisplayValue);
690
val = Eval ("SomeEnum.two");
691
Assert.AreEqual ("SomeEnum.two", val.Value);
692
Assert.AreEqual ("two", val.DisplayValue);
694
val = Eval ("SomeEnum.one | SomeEnum.two");
695
Assert.AreEqual ("SomeEnum.one|SomeEnum.two", val.Value);
696
Assert.AreEqual ("one|two", val.DisplayValue);