All files connection.ts

100% Statements 55/55
82.14% Branches 23/28
100% Functions 11/11
100% Lines 51/51

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175                6x                                                                     20x 20x 20x 14x 10x   4x                   6x 2x 1x   1x   2x               6x 3x 3x 3x 3x 3x     3x 1x     3x               6x 2x 1x   1x   2x               6x 1x 1x 2x     1x             6x 2x             6x 3x                 6x 1x             6x 2x 2x 2x 2x     2x               6x 2x 2x 2x 1x       1x   6x   6x  
import * as Interface from '../interface';
import * as Types from '../types';
 
/**
 * Класс `Connection` позволяет соединять входы и выходы различных элементов.
 * Соединение всегда имеет обязательный выход, а входы могут быть
 * как отсутствовать, так и быть в единственном или множественном числе.
 */
class Connection implements Interface.Connection {
    in: Types.SourcesArray | false;
    readonly out: Types.Sources;
 
    /**
     * Создает новое соединение с подключением только выхода,
     * оставляя вход свободным.
     * @param outSource выход соединения
     */
    constructor(outSource: Types.Sources);
 
    /**
     * Создает новое соединение с одним выходом и одним входом.
     * @param outSource выход соединения
     * @param inSource вход соединения
     */
    constructor(outSource: Types.Sources, inSource: Types.Sources);
 
    /**
     * Создает новое соединение с одним выходом и несколькими входами.
     * @param outSource выход соединения
     * @param inSourceArray массив входов соединения
     */
    constructor(outSource: Types.Sources, inSourceArray: Types.SourcesArray);
 
    /**
     * Основной конструктор, который позволяет создать соединение с
     * одним выходом и опциональными входами.
     * Соединение обязательно должно иметь выход, но может не иметь входов
     * либо иметь один или несколько.
     *
     * @param outSource выход соединения
     * @param arg2 вход (или массив входов) соединения (не обязательно)
     */
    constructor(outSource: Types.Sources, arg2?: Types.Sources | Types.SourcesArray) {
        this.in = false;
        this.out = outSource;
        if (arg2) {
            if (Array.isArray(arg2)) {
                this.in = arg2;
            } else {
                this.in = [arg2];
            }
        }
    }
 
    /**
     * Подключает вход другого элемента к текущему соединению.
     * @param inSource вход элемента
     * @returns текущее соединение
     */
    inConnect(inSource: Types.Sources): Interface.Connection {
        if (Array.isArray(this.in)) {
            this.in.push(inSource);
        } else {
            this.in = [inSource];
        }
        return this;
    }
 
    /**
     * Отключает вход от текущего соединения.
     * @param inSource вход, который нужно отсоединить
     * @returns текущее соединение
     */
    disConnect(inSource: Types.Sources): Interface.Connection {
        Eif (Array.isArray(this.in)) {
            for (let i = 0; i < this.in.length; i++) {
                Eif (this.in[i].name === inSource.name && this.in[i].element === inSource.element) {
                    this.in.splice(i, 1);
                    break;
                }
            }
            if (this.in.length === 0) {
                this.in = false;
            }
        }
        return this;
    }
 
    /**
     * Подключает несколько входов к текущему соединению.
     * @param inSourceArray массив входов
     * @returns текущее соединение
     */
    inConnects(inSourceArray: Types.SourcesArray): Interface.Connection {
        if (Array.isArray(this.in)) {
            this.in.push(...inSourceArray);
        } else {
            this.in = inSourceArray;
        }
        return this;
    }
 
    /**
     * Отключает несколько входов от текущего соединения.
     * @param inSourceArray массив входов, которые нужно отсоединить
     * @returns текущее соединение
     */
    disConnects(inSourceArray: Types.SourcesArray): Interface.Connection {
        Eif (Array.isArray(this.in)) {
            for (let i = 0; i < inSourceArray.length; i++) {
                this.disConnect(inSourceArray[i]);
            }
        }
        return this;
    }
 
    /**
     * Проверяет, подключено ли текущее соединение хотя бы к одному входу.
     * @returns true, если подключен хотя бы один вход
     */
    isConnected(): boolean {
        return Array.isArray(this.in) && this.in.length > 0;
    }
 
    /**
     * Возвращает количество подключенных входов.
     * @returns количество входов
     */
    lenInConnected(): number {
        return Array.isArray(this.in) ? this.in.length : 0;
    }
 
    /**
     * Клонирует текущее соединение, создавая новое с такими же входами,
     * но подключенное к другому элементу.
     * @param element элемент, к которому подключен выход нового соединения
     * @returns новое соединение с клонированными входами
     */
    clone(element: Interface.Element): Interface.Connection {
        return new Connection({name: this.out.name, element: element});
    }
 
    /**
     * Возвращает массив имен входов, подключенных к текущему соединению.
     * @returns массив строк с именами входов
     */
    getArrayInString(): string[] {
        const arr: string[] = [];
        Eif (Array.isArray(this.in)) {
            for (let i = 0; i < this.in.length; i++) {
                arr.push(this.in[i].name);
            }
        }
        return arr;
    }
 
    /**
     * Находит вход, который принадлежит указанному элементу.
     * @param element элемент, для которого нужно найти подключенный вход
     * @returns название входа
     */
    findInString(element: Interface.Element): string {
        Eif (Array.isArray(this.in)) {
            for (let i = 0; i < this.in.length; i++) {
                if (this.in[i].element === element) {
                    return this.in[i].name;
                }
            }
        }
        return '';
    }
}
 
export {Connection};