File size: 2,337 Bytes
61d39e2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
/*

 * Copyright (C) 2024-present Puter Technologies Inc.

 *

 * This file is part of Puter.

 *

 * Puter is free software: you can redistribute it and/or modify

 * it under the terms of the GNU Affero General Public License as published

 * by the Free Software Foundation, either version 3 of the License, or

 * (at your option) any later version.

 *

 * This program is distributed in the hope that it will be useful,

 * but WITHOUT ANY WARRANTY; without even the implied warranty of

 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

 * GNU Affero General Public License for more details.

 *

 * You should have received a copy of the GNU Affero General Public License

 * along with this program.  If not, see <https://www.gnu.org/licenses/>.

 */

const { expect } = require('chai');
const { AdvancedBase } = require('../src/AdvancedBase');

class TestClass extends AdvancedBase {
    static IMPLEMENTS = {
        test_trait: {
            test_method: () => 'A',
        },
        override_trait: {
            preserved_method: () => 'B',
            override_method: () => 'C',
        },
    };
}

class TestSubClass extends TestClass {
    static IMPLEMENTS = {
        override_trait: {
            override_method: () => 'D',
        },
    };
}

describe('traits', () => {
    it('instance.as', () => {
        const o = new TestClass();
        expect(o.as).to.be.a('function');
        const ot = o.as('test_trait');
        expect(ot.test_method).to.be.a('function');
        expect(ot.test_method()).to.equal('A');
    });
    it('traits of parent', () => {
        const o = new TestSubClass();
        console.log(o._get_merged_static_object('IMPLEMENTS'));
        expect(o.as).to.be.a('function');
        const ot = o.as('test_trait');
        expect(ot.test_method).to.be.a('function');
        expect(ot.test_method()).to.equal('A');
    });
    it('trait method overrides', () => {
        const o = new TestSubClass();
        expect(o.as).to.be.a('function');
        const ot = o.as('override_trait');
        expect(ot.preserved_method).to.be.a('function');
        expect(ot.override_method).to.be.a('function');
        expect (ot.preserved_method()).to.equal('B');
        expect (ot.override_method()).to.equal('D');
    });
});