Agent skill

Unit Test Boundary Conditions

by giuseppe-trisciuoglio in giuseppe-trisciuoglio/developer-kit

Provides edge case, corner case, boundary condition, and limit testing patterns for Java unit tests.

MITAuto-check: notesTesting & QA

Install Unit Test Boundary Conditions

skills CLI
$ npx skills add giuseppe-trisciuoglio/developer-kit --skill unit-test-boundary-conditions -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install giuseppe-trisciuoglio/developer-kit unit-test-boundary-conditions --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/giuseppe-trisciuoglio/developer-kit.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/developer-kit-java/skills/unit-test-boundary-conditions .claude/skills/unit-test-boundary-conditions && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
unit-test-boundary-conditions
GitHub stars
357
Token cost
~2.3k tokens
SKILL.md length
355 words
Files
3 (incl. references)
Skills in repo
115
Repo updated
First seen
Licence
MIT

At a glance

Provides edge case, corner case, boundary condition, and limit testing patterns for Java unit tests.

  • Works in 9 steps: Identify boundaries: List numeric limits… → Apply parameterized tests: Use… → Test both sides of boundaries: Cover… → …
  • Writing .java test files to ensure code handles limits
  • SKILL.md covers Overview, When to Use, Instructions and Examples, plus 9 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Unit Test Boundary Conditions is an agent skill from giuseppe-trisciuoglio/developer-kit. Provides edge case, corner case, boundary condition, and limit testing patterns for Java unit tests. Validates minimum/maximum values, null cases, empty collections, numeric overflow/underflow, floating-point precision, and off-by-one scenarios using JUnit 5 and AssertJ. Use when writing .java test files to ensure code handles limits, corner cases, and special inputs correctly.

Its SKILL.md is about 2.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including reference files (for example `references/concurrent-testing.md` and `references/parameterized-patterns.md`).

It sits in Testing & QA, covering Unit testing and Test strategy. It works with JUnit and Java. The repository describes itself as: Modular plugin marketplace for Claude Code and agentic CLIs, with validated, spec-driven skills, agents, commands, and workflows for Java, TypeScript, Python, PHP, AWS, and AI. The licence is MIT.

When your agent uses it

  • Writing .java test files to ensure code handles limits
  • Special inputs correctly

Example prompts

  • “Use the unit-test-boundary-conditions skill to provide edge case, corner case, boundary condition, and limit testing patterns for Java unit tests”
  • “/unit-test-boundary-conditions”

Requirements

  • Pre-approved tools (allowed-tools): Read, Write, Bash, Glob, Grep

Workflow steps

9 steps, taken from the first numbered list in SKILL.md.

  1. Identify boundaries: List numeric limits (MIN_VALUE, MAX_VALUE, zero), string states (null, empty, whitespace), collection sizes (0, 1…
  2. Apply parameterized tests: Use @ParameterizedTest with @ValueSource or @CsvSource for multiple boundary values
  3. Test both sides of boundaries: Cover values just below, at, and just above each boundary
  4. Run tests after adding each boundary category to catch issues early
  5. Verify floating-point precision: Use isCloseTo(expected, within(tolerance)) with AssertJ
  6. Test collection states: Explicitly test empty (0), single (1), and many (>1) element scenarios
  7. Handle overflow/underflow: Use Math.addExact() and Math.subtractExact() to detect arithmetic overflow
  8. Test date/time edges: Verify leap years, month boundaries, timezone transitions
  9. Iterate based on failures: When a boundary test fails, analyze the error to discover additional untested boundaries; add test cases for…

What it can do on your machine

Read from SKILL.md and the folder at commit fe73fb3. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • Read
    • Write
    • Bash
    • Glob
    • Grep

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are java).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • docs.oracle.com
    • assertj.github.io
    • en.wikipedia.org

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Unit Test Boundary Conditions loads about 2.3k tokens when it runs, and up to ~3.1k if it reads all its reference files. Until then it costs about 103 tokens; SKILL.md has 355 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~103
When it runs · the whole SKILL.md, loaded when a task matches
~2.3k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~3.1k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NotePre-approves every shell command (allowed-tools: Bash)SKILL.md
    allowed-tools: Read, Write, Bash, Glob, Grep

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from giuseppe-trisciuoglio/developer-kit at commit fe73fb3, republished under its MIT licence (© giuseppe-trisciuoglio). 355 words, ~2,252 tokens.

Download SKILL.mdSave it as .claude/skills/unit-test-boundary-conditions/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.
name
unit-test-boundary-conditions
description
Provides edge case, corner case, boundary condition, and limit testing patterns for Java unit tests. Validates minimum/maximum values, null cases, empty collections, numeric overflow/underflow, floating-point precision, and off-by-one scenarios using JUnit 5 and AssertJ. Use when writing .java test files to ensure code handles limits, corner cases, and special inputs correctly.
allowed-tools
Read, Write, Bash, Glob, Grep

Unit Testing Boundary Conditions and Edge Cases

Overview

Systematic patterns for testing boundary conditions, corner cases, and limit values in Java using JUnit 5. Covers numeric boundaries, string edge cases, collection states, floating-point precision, date/time limits, and off-by-one scenarios.

When to Use

  • Numeric min/max limits, null/empty/whitespace inputs
  • Overflow/underflow validation, collection boundaries
  • Off-by-one errors, floating-point precision

Instructions

  1. Identify boundaries: List numeric limits (MIN_VALUE, MAX_VALUE, zero), string states (null, empty, whitespace), collection sizes (0, 1, many)
  2. Apply parameterized tests: Use @ParameterizedTest with @ValueSource or @CsvSource for multiple boundary values
  3. Test both sides of boundaries: Cover values just below, at, and just above each boundary
  4. Run tests after adding each boundary category to catch issues early
  5. Verify floating-point precision: Use isCloseTo(expected, within(tolerance)) with AssertJ
  6. Test collection states: Explicitly test empty (0), single (1), and many (>1) element scenarios
  7. Handle overflow/underflow: Use Math.addExact() and Math.subtractExact() to detect arithmetic overflow
  8. Test date/time edges: Verify leap years, month boundaries, timezone transitions
  9. Iterate based on failures: When a boundary test fails, analyze the error to discover additional untested boundaries; add test cases for the newly discovered edge conditions

Examples

Requires: junit-jupiter, junit-jupiter-params, assertj-core.

Integer Boundary Testing

java
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import static org.assertj.core.api.Assertions.*;

class IntegerBoundaryTest {

  @ParameterizedTest
  @ValueSource(ints = {Integer.MIN_VALUE, Integer.MIN_VALUE + 1, 0, Integer.MAX_VALUE - 1, Integer.MAX_VALUE})
  void shouldHandleIntegerBoundaries(int value) {
    assertThat(value).isNotNull();
  }

  @Test
  void shouldDetectIntegerOverflow() {
    assertThatThrownBy(() -> Math.addExact(Integer.MAX_VALUE, 1))
      .isInstanceOf(ArithmeticException.class);
  }

  @Test
  void shouldDetectIntegerUnderflow() {
    assertThatThrownBy(() -> Math.subtractExact(Integer.MIN_VALUE, 1))
      .isInstanceOf(ArithmeticException.class);
  }

  @Test
  void shouldHandleZeroEdge() {
    int result = MathUtils.divide(0, 5);
    assertThat(result).isZero();

    assertThatThrownBy(() -> MathUtils.divide(5, 0))
      .isInstanceOf(ArithmeticException.class);
  }
}

String Boundary Testing

java
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

class StringBoundaryTest {

  @ParameterizedTest
  @ValueSource(strings = {"", " ", "  ", "\t", "\n"})
  void shouldRejectEmptyAndWhitespace(String input) {
    boolean result = StringUtils.isNotBlank(input);
    assertThat(result).isFalse();
  }

  @Test
  void shouldHandleNullString() {
    String result = StringUtils.trim(null);
    assertThat(result).isNull();
  }

  @Test
  void shouldHandleSingleCharacter() {
    assertThat(StringUtils.capitalize("a")).isEqualTo("A");
    assertThat(StringUtils.trim("x")).isEqualTo("x");
  }

  @Test
  void shouldHandleVeryLongString() {
    String longString = "x".repeat(1000000);

    assertThat(longString.length()).isEqualTo(1000000);
    assertThat(StringUtils.isNotBlank(longString)).isTrue();
  }
}

Collection Boundary Testing

java
class CollectionBoundaryTest {

  @Test
  void shouldHandleEmptyList() {
    List<String> empty = List.of();

    assertThat(empty).isEmpty();
    assertThat(CollectionUtils.first(empty)).isNull();
    assertThat(CollectionUtils.count(empty)).isZero();
  }

  @Test
  void shouldHandleSingleElementList() {
    List<String> single = List.of("only");

    assertThat(single).hasSize(1);
    assertThat(CollectionUtils.first(single)).isEqualTo("only");
    assertThat(CollectionUtils.last(single)).isEqualTo("only");
  }

  @Test
  void shouldHandleLargeList() {
    List<Integer> large = new ArrayList<>();
    for (int i = 0; i < 100000; i++) {
      large.add(i);
    }

    assertThat(large).hasSize(100000);
    assertThat(CollectionUtils.first(large)).isZero();
    assertThat(CollectionUtils.last(large)).isEqualTo(99999);
  }

  @Test
  void shouldHandleNullInCollection() {
    List<String> withNull = new ArrayList<>(List.of("a", null, "c"));

    assertThat(withNull).contains(null);
    assertThat(CollectionUtils.filterNonNull(withNull)).hasSize(2);
  }
}

Floating-Point Boundary Testing

java
class FloatingPointBoundaryTest {

  @Test
  void shouldHandleFloatingPointPrecision() {
    double result = 0.1 + 0.2;
    assertThat(result).isCloseTo(0.3, within(0.0001));
  }

  @Test
  void shouldHandleSpecialFloatingPointValues() {
    assertThat(Double.POSITIVE_INFINITY).isGreaterThan(Double.MAX_VALUE);
    assertThat(Double.NEGATIVE_INFINITY).isLessThan(Double.MIN_VALUE);
    assertThat(Double.NaN).isNotEqualTo(Double.NaN);
  }

  @Test
  void shouldHandleZeroInDivision() {
    assertThat(1.0 / 0.0).isEqualTo(Double.POSITIVE_INFINITY);
    assertThat(-1.0 / 0.0).isEqualTo(Double.NEGATIVE_INFINITY);
    assertThat(0.0 / 0.0).isNaN();
  }
}

Date/Time Boundary Testing

java
class DateTimeBoundaryTest {

  @Test
  void shouldHandleMinAndMaxDates() {
    LocalDate min = LocalDate.MIN;
    LocalDate max = LocalDate.MAX;

    assertThat(min).isBefore(max);
    assertThat(DateUtils.isValid(min)).isTrue();
    assertThat(DateUtils.isValid(max)).isTrue();
  }

  @Test
  void shouldHandleLeapYearBoundary() {
    LocalDate leapYearEnd = LocalDate.of(2024, 2, 29);
    assertThat(leapYearEnd).isNotNull();
  }

  @Test
  void shouldRejectInvalidDateInNonLeapYear() {
    assertThatThrownBy(() -> LocalDate.of(2023, 2, 29))
      .isInstanceOf(DateTimeException.class);
  }
}

Array Index Boundary Testing

java
class ArrayBoundaryTest {

  @Test
  void shouldHandleFirstElementAccess() {
    int[] array = {1, 2, 3, 4, 5};
    assertThat(array[0]).isEqualTo(1);
  }

  @Test
  void shouldHandleLastElementAccess() {
    int[] array = {1, 2, 3, 4, 5};
    assertThat(array[array.length - 1]).isEqualTo(5);
  }

  @Test
  void shouldThrowOnNegativeIndex() {
    int[] array = {1, 2, 3};
    assertThatThrownBy(() -> array[-1])
      .isInstanceOf(ArrayIndexOutOfBoundsException.class);
  }

  @Test
  void shouldThrowOnOutOfBoundsIndex() {
    int[] array = {1, 2, 3};
    assertThatThrownBy(() -> array[10])
      .isInstanceOf(ArrayIndexOutOfBoundsException.class);
  }

  @Test
  void shouldHandleEmptyArray() {
    int[] empty = {};
    assertThat(empty.length).isZero();
    assertThatThrownBy(() -> empty[0])
      .isInstanceOf(ArrayIndexOutOfBoundsException.class);
  }
}
Show full SKILL.md (141 more words)Show less

Best Practices

  • Test at boundaries explicitly: don't rely on random testing
  • Test null and empty separately from valid inputs
  • Use parameterized tests for multiple boundary cases
  • Test both sides of boundaries (just below, at, just above)
  • Verify error messages for invalid boundary inputs
  • Document why specific boundaries matter for your domain
  • Test overflow/underflow for all numeric operations

Constraints and Warnings

  • Integer overflow: Use Math.addExact() to detect silent overflow
  • Floating-point precision: Never use exact equality; always use tolerance-based assertions
  • NaN behavior: NaN != NaN; use Float.isNaN() or Double.isNaN()
  • Collection size limits: Be mindful of memory with large test collections
  • String encoding: Test with Unicode characters for internationalization
  • Date/time boundaries: Account for timezone transitions and daylight saving
  • Array indexing: Always test index 0, length-1, and out-of-bounds

References

© giuseppe-trisciuoglio, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 2 other files (references) in plugins/developer-kit-java/skills/unit-test-boundary-conditions of giuseppe-trisciuoglio/developer-kit.

  • SKILL.md
  • references/concurrent-testing.md
  • references/parameterized-patterns.md

Open the folder on GitHubat commit fe73fb3

Compare with similar skills

Unit Test Boundary Conditions next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Unit Test Boundary Conditions compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Unit Test Boundary Conditions this skillgiuseppe-trisciuoglio/developer-kit357—~2.3kAutomated safety check: NotesMIT
Java Regression Test GeneratorArabelaTso/Skills-4-SE253—~4kAutomated safety check: PassApache-2.0
Debug Surefireeclipse-rdf4j/rdf4j420—~2.4kAutomated safety check: PassBSD-3-Clause
Minecraft TestingJahrome907/minecraft-agent-skills170—~3.8kAutomated safety check: PassMIT
Eclipse Testgradusnikov/eclipse-chatgpt-plugin172—~1kAutomated safety check: PassMIT
Unit TestingLeavesfly/Jimi237—~667Automated safety check: PassNone

Similar skills

  • Java Regression Test Generator

    ArabelaTso/Skills-4-SE

    Automatically generate regression tests for Java codebases by analyzing changes between old and new code versions.

    253 GitHub stars~4k tokensUpdated 1 mo ago
    Testing & QAAuto-check passed
  • Debug Surefire

    eclipse-rdf4j/rdf4j

    Debug Maven Surefire unit tests by running them in JDWP "wait for debugger" mode (-Dmaven.surefire.debug) and attaching to the forked test JVM using jdb (preferred for CLI/agent debugging)…

    420 GitHub stars~2.4k tokensUpdated 2 days ago
    Testing & QAAuto-check passed
  • Minecraft Testing

    Jahrome907/minecraft-agent-skills

    Design and implement automated tests for current Minecraft 26.x or legacy 1.21.x mods and plugins using JUnit, MockBukkit, NeoForge Game Tests, or Fabric Game Tests.

    170 GitHub stars~3.8k tokensUpdated 28 days ago
    Testing & QAAuto-check passed
  • Eclipse Test

    gradusnikov/eclipse-chatgpt-plugin

    Run JUnit tests in Eclipse projects — all tests, by package, by class, or individual test methods.

    172 GitHub stars~1k tokensUpdated today
    Testing & QAAuto-check passed
  • Unit Testing

    Leavesfly/Jimi

    Java单元测试编写指南(基于JUnit和Mockito)

    237 GitHub stars~667 tokensUpdated 1 mo ago
    Testing & QAAuto-check passed
  • Official

    Convert JUnit 5 @MethodSource/@CsvSource/@ValueSource parameterized tests to @TableTest (JDK8)

    736 GitHub stars~950 tokensUpdated today
    Testing & QAAuto-check passed

More from giuseppe-trisciuoglio/developer-kit

All 115 skills in this repo
  • Nestjs Drizzle Crud Generator

    giuseppe-trisciuoglio/developer-kit

    Generates complete CRUD modules for NestJS applications with Drizzle ORM.

    357 GitHub stars~1.3k tokensUpdated 1 mo ago
    Auto-check: notes
  • Spring Boot Actuator

    giuseppe-trisciuoglio/developer-kit

    Provides patterns to configure Spring Boot Actuator for production-grade monitoring, health probes, secured management endpoints, and Micrometer metrics across JVM services.

    357 GitHub stars~2.2k tokensUpdated 1 mo ago
    Auto-check: notes
  • Spring Boot Crud Patterns

    giuseppe-trisciuoglio/developer-kit

    Provides and generates complete CRUD workflows for Spring Boot 3 services.

    357 GitHub stars~2.5k tokensUpdated 1 mo ago
    Auto-check: notes
  • Spring Boot Security JWT

    giuseppe-trisciuoglio/developer-kit

    Provides JWT authentication and authorization patterns for Spring Boot 3.5.x covering token generation with JJWT, Bearer/cookie authentication, database/OAuth2 integration, and RBAC/permission-based…

    357 GitHub stars~3.9k tokensUpdated 1 mo ago
    Auto-check: notes
  • AWS CLI Beast

    giuseppe-trisciuoglio/developer-kit

    Provides advanced AWS CLI patterns for managing EC2, Lambda, S3, DynamoDB, RDS, VPC, IAM, and CloudWatch.

    357 GitHub stars~1.7k tokensUpdated 1 mo ago
    Auto-check: notes
  • PR Review Comments

    giuseppe-trisciuoglio/developer-kit

    Posts review findings from a JSON file as inline comments on a GitHub Pull Request, attaching each comment to its file and line.

    357 GitHub stars~1k tokensUpdated 1 mo ago
    Auto-check: notes

Works with

Categories

Questions about Unit Test Boundary Conditions

What does Unit Test Boundary Conditions do?

Provides edge case, corner case, boundary condition, and limit testing patterns for Java unit tests. Unit Test Boundary Conditions is an agent skill from giuseppe-trisciuoglio/developer-kit. Provides edge case, corner case, boundary condition, and limit testing patterns for Java unit tests.

When should I use Unit Test Boundary Conditions?

Unit Test Boundary Conditions fits situations like: writing .java test files to ensure code handles limits; special inputs correctly.

How do I install Unit Test Boundary Conditions in Claude Code?

Run `npx skills add giuseppe-trisciuoglio/developer-kit --skill unit-test-boundary-conditions -a claude-code`. Or copy the skill folder (plugins/developer-kit-java/skills/unit-test-boundary-conditions in giuseppe-trisciuoglio/developer-kit) into .claude/skills/unit-test-boundary-conditions in your project. Claude Code loads it when a task matches its description.

How do I install Unit Test Boundary Conditions in Codex?

Run `npx skills add giuseppe-trisciuoglio/developer-kit --skill unit-test-boundary-conditions -a codex`. Or copy the skill folder (plugins/developer-kit-java/skills/unit-test-boundary-conditions in giuseppe-trisciuoglio/developer-kit) into .agents/skills/unit-test-boundary-conditions in your project. Codex loads it when a task matches its description.

Can I use Unit Test Boundary Conditions in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add giuseppe-trisciuoglio/developer-kit --skill unit-test-boundary-conditions -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/unit-test-boundary-conditions, .gemini/skills/unit-test-boundary-conditions, .github/skills/unit-test-boundary-conditions and .opencode/skills/unit-test-boundary-conditions in your project.

What does Unit Test Boundary Conditions need to run?

SKILL.md names no scripts, command-line tools or credentials: Unit Test Boundary Conditions is instructions for the agent only. Its frontmatter pre-approves these tools: Read, Write, Bash, Glob, Grep.

Does Unit Test Boundary Conditions access the network?

SKILL.md names 3 domains. As links in the text: docs.oracle.com, assertj.github.io and en.wikipedia.org. This is read from the text; nothing was executed.

Is Unit Test Boundary Conditions safe to install?

Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.

What licence does Unit Test Boundary Conditions use?

Unit Test Boundary Conditions is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Unit Test Boundary Conditions use?

About 2.3k tokens (SKILL.md is roughly 9k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 801 tokens, read only when the agent opens those files.

What are the alternatives to Unit Test Boundary Conditions?

Skills that share tags, products or a category with Unit Test Boundary Conditions: Java Regression Test Generator (ArabelaTso/Skills-4-SE, 253 stars), Debug Surefire (eclipse-rdf4j/rdf4j, 420 stars), Minecraft Testing (Jahrome907/minecraft-agent-skills, 170 stars) and Eclipse Test (gradusnikov/eclipse-chatgpt-plugin, 172 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Unit Test Boundary Conditions?

giuseppe-trisciuoglio (a GitHub user) maintains it in giuseppe-trisciuoglio/developer-kit, which has 357 GitHub stars. The repository holds 115 skills in this directory. The repository was last updated on September 10, 2026.

Source: giuseppe-trisciuoglio/developer-kit on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.