Word Wrap

Level: Intermediate 30–60 min

Concepts: Strings

Solutions: C# | TypeScript | Python


Create a program that wraps text at a specified column width.

Requirements

  1. Implement text wrapping rules:
    • Break text at word boundaries when possible
    • Break words only if they exceed the column width
    • Preserve whitespace between words
    • Handle multiple spaces and tabs
  2. Handle edge cases:
    • Empty input
    • Input shorter than column width
    • Words longer than column width
    • Multiple consecutive spaces
  3. Return appropriate results:
    • Wrapped text as a string
    • Error message for invalid inputs

Test Cases

InputColumn WidthExpected OutputNotes
”Hello”5”Hello”No wrapping needed
”Hello World”5”Hello\nWorld”Break at word boundary
”Hello World”7”Hello\nWorld”Break at word boundary
”Hello World”20”Hello World”No wrapping needed
”Supercalifragilisticexpialidocious”10”Supercalif\nragilisti\ncexpiali\ndocious”Break long word
”Hello World”5”Hello\nWorld”Handle multiple spaces

Edge Cases to Consider

  • Empty string
  • Null input
  • Zero or negative column width
  • Very long words
  • Multiple consecutive spaces or tabs
  • Text with line breaks

Tips

  • Start with simple cases (no wrapping needed)
  • Add word boundary breaking next
  • Then handle long words
  • Finally add whitespace handling
  • Consider using regular expressions for word boundaries

Reference Walkthrough

Reference implementations in C#, TypeScript, and Python live at tddbuddy-reference-katas/word-wrap. This is an F1 kata — twelve scenarios covering empty and whitespace-only input, single-word lines, greedy word-boundary packing, oversize-word hard splitting, oversize-remainder joining with the next word, and whitespace collapsing — shared across all three languages, each a single pure function wrap(text, width) returning a \n-joined string.

This kata ships in Agent Full-Bake mode at high gear: the rules land as one commit per language, with a brief walkthrough noting there are no builders because the inputs and outputs are the domain. A greedy line-packer tokenizes on runs of whitespace, accumulates words until the next word would push the line past width, splits any oversize word hard at the width-th character before letting its remainder begin the next line (where following words may still join it if they fit), and joins the resulting lines with \n — matching the classic Kent Beck kata shape that returns a single string rather than a list. See the repo’s Gears section for when high gear is the right call.


  • Katas Are Rehearsal, Not Performance
    You don't practice TDD on production code. You practice on katas and bring the muscle memory to production. The gap between knowing TDD and doing TDD is reps.
  • The Test Pyramid Was an Economic Argument
    The test pyramid was not a quality law. It was a cost structure: unit tests were cheap, integration tests were expensive, so you wrote many of the first and few of the second. Agents collapsed the cost of writing tests at every level, and the cheapest test that still tells the truth is the one that pins a seam the agent cannot fake.
  • Agents Pattern-Match Your Test Smells
    Test smells used to drift in at typing speed. Agents reproduce them at generation speed because they sample whatever is already in the suite. The smells in your codebase are now the smells in your roadmap.