# Compare

Интерфейс **Compare assertion**-а выглядит следующим образом:

![](/files/-M2TMFw7YXNfGyuQR4Pa)

**Compare assertion** служит для сравнения 2 значений. В поле `Expected value type` указывается какого типа значения будут сравниваться - строки, числа, JSON-объекты.

От выбранного типа значения зависит доступный набор операций сравнения, которые можно выбрать в поле `Operator`. Для типов string и number доступны следующие операторы:

* **equal** - проверка на равенство значений
* **not equal** - проверка на неравенство значений
* **greater** - проверка на то, что текущее значение больше ожидаемого
* **greater or equal** - проверка на то, что текущее значение больше ожидаемого или  равно ему
* **less** - проверка на то, что текущее значение меньше ожидаемого
* **less or equal** - проверка на то, что текущее значение меньше ожидаемого или равно ему

{% hint style="warning" %}
Важно отметить, что при сравнении значений, которые можно представить и как строки и как числа, результат некоторых операторов может показаться неожиданным. Например, возьмем утверждение число 100 больше числа 2. Такой assertion завершится успешно. Однако, если сравнивать те же значения но как строки ("100" is greater than "2"), то assertion завершится с ошибкой. Это объясняется тем, что строки сравниваются посимвольно в алфавитном порядке.
{% endhint %}

Для типа object доступны следующие операторы:

* **equal** - проверка на точное соответсвие структуры объектов
* **not equal** - проверка на то, что структуры объектов различаются
* **is subset of** - проверка на то, что структура актуального значения содержится в структуре ожидаемого значения.
* **is superset of** - проверка на то, что структура актуального значения содержит в себе структуру ожидаемого значения.

{% hint style="success" %}
Поясняющие примеры для операторов "**is subset of"** и "**is superset of**"

Пусть актуальное значение равно:

```javascript
[
    { 
        "name": "Mike"
    }
]
```

А ожидаемое значение:

```javascript
[
    { 
        "id": 0,
        "name": "John",
        "name": 24
    },
    {
        "id": 1,
        "name": "Mike",
        "age": 28
    }
]
```

В данном примере актуальное значение является подмножеством ожидаемого значения. Автоматически верно и обратное - ожидаемое значение является надмножеством актуального.

Структуры сравниваются рекурсивно, проверяя на соответствие каждый уровень вложенности. В примере выше сначала проверяется, что на верхнем уровне оба значения представляют из себя массив, затем каждый элемент массива из актуального значения сравнивается с каждым элементом из ожидаемого, пока не встретится первое совпадение. Объекты сравниваются на соответствие строковых ключей и их значений.

Отдельно стоит отметить, что при сравнении элементов массивов происходит поиск подпоследовательности, а не поэлементный поиск. Например, массив `[2,4]` является подмножеством массива `[1,2,3,4]`, а массив `[4, 2]` - уже нет.
{% endhint %}

### Исправление ошибок

Алгоритм исправления ошибок зависит от каждого конкретного компаратора.

* **equal** - ожидаемому значению присваивается текущее значение
* **not equal** - компаратор меняется на **equal**
* **greater** - компаратор меняется на **greater or equal** и ожидаемому значению присваивается текущее значение
* **greater or equal** - ожидаемому значению присваивается текущее значение
* **less** - компаратор меняется на **less or equal** и ожидаемому значению присваивается текущее значение
* **less or equal** - ожидаемому значению присваивается текущее значение

### Файловое представление

В файле **Assertion** имеет тип `compare` , описание самого типа можно найти в документации к [файловому представлению Assertion](/node-types/assertion.md#failovoe-predstavlenie) в определении `#/definitions/CompareAssertion` .


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs-ru.testmace.com/node-types/assertion/compare.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
