summaryrefslogtreecommitdiff
path: root/src/tests/efl_mono/EoConstruction.cs
blob: bfcf40b0f1ea3da140b5900926312f65976df4e0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
using System;

class InheritedConstructibleObject : Dummy.ConstructibleObject
{
    public InheritedConstructibleObject() : base()
    {
        if (this.NativeConstructionCount != 1)
        {
            DefaultConstrutorCallCount = -100;
        }

        ++DefaultConstrutorCallCount;
        this.IncrementDefaultConstructionCount();
    }

    private InheritedConstructibleObject(ConstructingHandle ch) : base(ch)
    {
        if (this.NativeConstructionCount != 1)
        {
            SpecialConstrutorCallCount = -100;
        }

        ++SpecialConstrutorCallCount;
        this.IncrementSpecialConstructionCount();
    }

    public int DefaultConstrutorCallCount { get; set; } = 0;
    public int SpecialConstrutorCallCount { get; set; } = 0;

    /// <summary>Pointer to the native class description.</summary>
    public bool IsInheritedClass
    {
        get { return !this.IsGeneratedBindingClass; }
    }

    public override int MultiplyIntegerValue(int v)
    {
        return 3 * v;
    }
}

namespace TestSuite
{

class TestEoConstruction
{
    public static void TestGeneratedEoDirectConstruction()
    {
        var obj = new Dummy.ConstructibleObject();
        Test.AssertEquals(obj.NativeConstructionCount, 1);
        Test.AssertEquals(obj.DefaultConstructionCount, 0);
        Test.AssertEquals(obj.SpecialConstructionCount, 0);
        Test.AssertEquals(obj.MultiplyIntegerValue(21), 42);
        obj.Dispose();
    }

    public static void TestInheritedEoDirectConstruction()
    {
        var obj = new InheritedConstructibleObject();
        Test.AssertEquals(obj.IsInheritedClass, true);
        Test.AssertEquals(obj.NativeConstructionCount, 1);
        Test.AssertEquals(obj.DefaultConstructionCount, 1);
        Test.AssertEquals(obj.SpecialConstructionCount, 0);
        Test.AssertEquals(obj.DefaultConstrutorCallCount, 1);
        Test.AssertEquals(obj.SpecialConstrutorCallCount, 0);
        Test.AssertEquals(obj.MultiplyIntegerValue(21), 63);
        obj.Dispose();
    }

    public static void TestInheritedEoIndirectConstruction()
    {
        var obj = new Dummy.ConstructibleObject();
        Test.AssertEquals(obj.NativeConstructionCount, 1);
        Test.AssertEquals(obj.DefaultConstructionCount, 0);
        Test.AssertEquals(obj.SpecialConstructionCount, 0);
        Test.AssertEquals(obj.MultiplyIntegerValue(21), 42);

        var obj2 = (InheritedConstructibleObject) obj.ConstructTypeAndStore(typeof(InheritedConstructibleObject));
        Test.AssertEquals(obj2.IsInheritedClass, true);
        Test.AssertEquals(obj2.NativeConstructionCount, 1);
        Test.AssertEquals(obj2.DefaultConstructionCount, 0);
        Test.AssertEquals(obj2.SpecialConstructionCount, 1);
        Test.AssertEquals(obj2.DefaultConstrutorCallCount, 0);
        Test.AssertEquals(obj2.SpecialConstrutorCallCount, 1);
        Test.AssertEquals(obj2.MultiplyIntegerValue(21), 63);

        var internalObj = obj.InternalObject;
        Test.Assert(ReferenceEquals(obj2, internalObj)); // Ensure it always use the same object instance
        Test.AssertEquals(obj2.NativeConstructionCount, 1); // And that constructors are not called again
        Test.AssertEquals(obj2.MultiplyIntegerValue(32), 96); // And that it is still usable

        obj.Dispose();
        obj2.Dispose();
    }
}

}