{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "0713b180",
   "metadata": {},
   "source": [
    "# 18-31 · Debug Labs\n",
    "\n",
    "Praktyka do sekcji [„Debug Labs”](/pl/chapters/rozdzial-18/18-31-debug-labs.html)."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2c7ef08c",
   "metadata": {},
   "source": [
    "## Cel\n",
    "\n",
    "Odtworzyć i naprawić dwa błędy historii: czyszczenie płótna powinno zerować historię (Debug Lab 11), a nowa akcja — zerować redo (Debug Lab 10)."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f7d86188",
   "metadata": {},
   "source": [
    "## Studium przypadku – Debug Lab 11: Sprzątanie i historia"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "87dd37d0",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-03T00:52:28.611035Z",
     "iopub.status.busy": "2026-09-03T00:52:28.610862Z",
     "iopub.status.idle": "2026-09-03T00:52:28.647968Z",
     "shell.execute_reply": "2026-09-03T00:52:28.647258Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[] [] []\n"
     ]
    }
   ],
   "source": [
    "document = [\"A\"]\n",
    "undo_stack = [[\"A\"]]\n",
    "redo_stack = []\n",
    "\n",
    "\n",
    "def clear_canvas(document, undo_stack, redo_stack):\n",
    "    \"\"\"История описывает документ. Нет документа — нет и истории.\"\"\"\n",
    "    document.clear()\n",
    "    undo_stack.clear()\n",
    "    redo_stack.clear()\n",
    "\n",
    "\n",
    "clear_canvas(document, undo_stack, redo_stack)\n",
    "print(document, undo_stack, redo_stack)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8cbc02d3",
   "metadata": {},
   "source": [
    "## Podstawowa praktyka zadań ★"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "d857e178",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-03T00:52:28.649884Z",
     "iopub.status.busy": "2026-09-03T00:52:28.649664Z",
     "iopub.status.idle": "2026-09-03T00:52:28.657785Z",
     "shell.execute_reply": "2026-09-03T00:52:28.657166Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Очистка холста обнулила и документ, и всю его историю.\n"
     ]
    }
   ],
   "source": [
    "assert document == []\n",
    "assert undo_stack == [], \"история отмены должна очищаться вместе с документом\"\n",
    "assert redo_stack == []\n",
    "print(\"Очистка холста обнулила и документ, и всю его историю.\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f26b1124",
   "metadata": {},
   "source": [
    "## Praktyczny przykład — Debug Lab 10: nowe działanie zeruje redo\n",
    "\n",
    "Drugi błąd z katalogu: jeśli `_commit_action()` zapomina wyczyścić `redo_stack`, wtedy Ctrl+Y po nowym rysunku przywraca na płótno figurę z cofniętej gałęzi, w żaden sposób niepowiązaną z bieżącym dokumentem."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "f5b9f466",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-03T00:52:28.659945Z",
     "iopub.status.busy": "2026-09-03T00:52:28.659723Z",
     "iopub.status.idle": "2026-09-03T00:52:28.666054Z",
     "shell.execute_reply": "2026-09-03T00:52:28.663869Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['A', 'C'] []\n"
     ]
    }
   ],
   "source": [
    "doc2, undo2, redo2 = [], [], []\n",
    "\n",
    "\n",
    "def commit_action(shapes):\n",
    "    doc2.extend(shapes)\n",
    "    undo2.append(shapes)\n",
    "    redo2.clear()   # ← строка, без которой возникает Debug Lab 10\n",
    "\n",
    "\n",
    "def undo():\n",
    "    if not undo2:\n",
    "        return\n",
    "    shapes = undo2.pop()\n",
    "    del doc2[len(doc2) - len(shapes):]\n",
    "    redo2.append(shapes)\n",
    "\n",
    "\n",
    "commit_action([\"A\"])\n",
    "commit_action([\"B\"])\n",
    "undo()                 # отменили B — оно ушло в redo2\n",
    "commit_action([\"C\"])   # новое действие ПОСЛЕ отмены\n",
    "print(doc2, redo2)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5932debe",
   "metadata": {},
   "source": [
    "## Podstawowa praktyka zadań ★"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "b6c2590b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-03T00:52:28.667942Z",
     "iopub.status.busy": "2026-09-03T00:52:28.667725Z",
     "iopub.status.idle": "2026-09-03T00:52:28.671007Z",
     "shell.execute_reply": "2026-09-03T00:52:28.670400Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Debug Lab 10 воспроизведён и починен: redo не воскресит чужую фигуру.\n"
     ]
    }
   ],
   "source": [
    "assert doc2 == [\"A\", \"C\"]\n",
    "assert redo2 == [], \"новое действие обязано сделать старую ветку redo недействительной\"\n",
    "print(\"Debug Lab 10 воспроизведён и починен: redo не воскресит чужую фигуру.\")\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Cartesian Python 3.14",
   "language": "python",
   "name": "cartesian-python314"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.14.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
