1 module unit_threaded.ut.issues; 2 3 import unit_threaded; 4 5 6 interface ICalcView { 7 @property string total() @safe pure; 8 @property void total(string t) @safe pure; 9 } 10 11 class CalcController { 12 private ICalcView view; 13 14 this(ICalcView view) @safe pure { 15 this.view = view; 16 } 17 18 void onClick(int number) @safe pure { 19 import std.conv: to; 20 view.total = number.to!string; 21 } 22 } 23 24 25 @("54") 26 @safe pure unittest { 27 auto m = mock!ICalcView; 28 m.expect!"total"("42"); 29 30 auto ctrl = new CalcController(m); 31 ctrl.onClick(42); 32 33 m.verify; 34 } 35 36 37 @("82") 38 @safe unittest { 39 40 import std.exception: assertThrown; 41 42 static class A { 43 string x; 44 45 override string toString() const { 46 return x; 47 } 48 } 49 50 class B : A {} 51 52 auto actual = new B; 53 auto expected = new B; 54 55 actual.x = "foo"; 56 expected.x = "bar"; 57 58 assertThrown(actual.shouldEqual(expected)); 59 } 60 61 62 @("124") 63 @safe pure unittest { 64 static struct Array { 65 66 alias opSlice this; 67 68 private int[] ints; 69 70 bool opCast(T)() const if(is(T == bool)) { 71 return ints.length != 0; 72 } 73 74 inout(int)[] opSlice() inout { 75 return ints; 76 } 77 } 78 79 { 80 auto arr = Array([1, 2, 3]); 81 arr.shouldEqual([1, 2, 3]); 82 } 83 84 { 85 const arr = Array([1, 2, 3]); 86 arr.shouldEqual([1, 2, 3]); 87 } 88 89 } 90 91 92 @("138") 93 @safe unittest { 94 import std.exception: assertThrown; 95 96 static class Class { 97 private string foo; 98 override bool opEquals(scope Object b) @safe @nogc pure nothrow scope const { 99 return foo == (cast(Class)b).foo; 100 } 101 } 102 103 auto a = new Class; 104 auto b = new Class; 105 106 a.foo = "1"; 107 b.foo = "2"; 108 109 // Object.opEquals isn't scope and therefore not @safe 110 assertThrown(() @trusted { a.should == b; }()); 111 }