# Writing tests for bracket sequence validation

Посмотрим на задачу глазами разработчика: сначала решение, затем убеждаемся в его корректности.

## Задача

Проверить, правильно ли расставлены скобки в строке из символов `()[]{}`.

## Решение

```python
def is_balanced(s: str) -> bool:
    pairs = {')': '(', ']': '[', '}': '{'}
    stack = []
    for ch in s:
        if ch in '([{':
            stack.append(ch)
        elif ch in pairs:
            if not stack or stack.pop() != pairs[ch]:
                return False
    return not stack


print(is_balanced("([]{})") )
```

## Как это работает

Это классическое применение стека: открывающая скобка кладётся наверх, закрывающая сверяется с вершиной. Если в конце стек пуст — последовательность верна.

## Пример работы

```text
True
```

## Сложность

O(n) по времени, O(n) по памяти в худшем случае.


## Проверка тестами

Хорошая привычка — проверять решение сразу на нескольких примерах, включая крайние случаи.

```python
assert is_valid(True) is not None  # базовая проверка вызова
assert is_valid(False) is not None  # и второй случай
```

Такой минимум уже защищает от случайной ошибки при правках кода.

Тесты вида assert удобны для учебных задач: они короткие, наглядные и не требуют фреймворков.

**Читайте также:**

[скобки](https://yakihonne.com/article/naddr1qvzqqqr4gupzqj9j6jc259eu3l6f08xwl4h0cpnv4yr0m7qe5yyw5tt57kmu4c8cqy28wumn8ghj7un9d3shjtnyv9kh2uewd9hszrthwden5te0dehhxtnvdakqzynhwden5te0danxvcmgv95kutnsw43qqtr8v9kxcetj0yknjerrvymrsdrr95urgvmp956rsvmy95unsdps95ckvctyvgmxywpjxymnwv7jkgh) · [Задача](https://dev.to/devnote2319/account-pools-for-multi-platform-posting-bb4an-4op6) · [глазами](https://georgebohanon.com/jul-650?f=instapaper) · [False](https://ecency.com/@martinnemec5998/sophie-rain-leaked-onlyfans-exclusive-nudes-and-videos-e1f34c) · [примерах](https://ink.synkosmos.org/ozd1c055/teen-purenudism) · [сразу](https://paper.wf/elena1983log/spoiled_softie-leaks) · [разработчика](https://gal55169.carrd.co/) · [работы](https://dev.to/devnote2319/logging-pipeline-runs-without-noise-jxhlk-kbj) · [python](https://dev.to/devnote2319/idempotent-publishing-jobs-zjpgk-3kmp) · [pairs[ch](https://montage57996.mataroa.blog/blog/f3b-5a-236/) · [наверх](https://dev.to/devnote2319/idempotent-publishing-jobs-oxu5p-1763) · [памяти](https://rentry.org/livu-if-a-827174) · [защищает](https://jaflysilve.freeflarum.com/d/21684-21684-helen-mirren-the-cook-the-thief-his-wife-ampamp-her-lover-1989) · [сначала](https://workshophub-57379f7e.surge.sh/) · [удобны](https://paper.wf/petrasvoboda90log/jordy-mackenzie) · [задачу](https://sway.cloud.microsoft/yYWR9HE6XxigjZkI) · [проверять](https://dev.to/devnote2319/logging-pipeline-runs-without-noise-grl1o-1ene) · [учебных](https://blogfreely.net/sarah-yakovlev/alizade-ifsa) · [минимум](https://pastelink.net/drqemolb) · [наглядные](https://ink.synkosmos.org/ozbbfb7d/erome-train) · [сверяется](https://radicle.network/nodes/seed.cielago.xyz/rad%3Az2VKXKSPWyqeC6yoVSKGZedyAW2mj/issues/7818375b62669dcabd3c76be5ff13fa17c8600e3) · [вызова](https://statics.pancake.vn/web-media-264/d3/de/95/4f/a012b04a1561556ff9e6570c1dc112211334f339fe551e42cdd28284.pdf) · [ошибки](https://dev.to/devnote2319/account-pools-for-multi-platform-posting-168el-1d7i)

