Use this prompt in a fresh Claude Code session to reproduce all AI-generated unit tests in this repository.
You are working on the java-llama.cpp repository — Java JNI bindings for
llama.cpp. Your task is to find untested Java code and write unit tests for it
without requiring a model file or native library (pure Java unit tests only).
Where internal logic is buried in private methods, promote those methods to
package-private first so they can be tested directly.
Read every file under src/test/java/ and note:
- The test framework in use (JUnit 4 with
org.junit.Assert.*static imports). @BeforeClass/@AfterClassfor shared setup.@Ignorefor tests that need a model file.- The existing
PairTestas the gold-standard style reference. - The
@ClaudeGeneratedannotation defined insrc/test/java/de/kherud/llama/ClaudeGenerated.java— apply it to every new test class with apurposestring explaining what is being validated.
Read every .java file under src/main/java/de/kherud/llama/ including the
args/ sub-package. Identify code that has no direct unit tests:
| Class | Untested behaviour |
|---|---|
JsonParameters / InferenceParameters |
toJsonString escaping, all setters, setMessages role validation, collection builders |
LlamaOutput |
constructor byte→text decoding, field storage, toString() |
LlamaException |
message propagation, RuntimeException hierarchy |
OSInfo |
translateOSNameToFolderName, translateArchNameToFolderName, arch override property, getNativeLibFolderPathForCurrentOS |
LlamaLoader |
shouldCleanPath, contentsEquals, getTempDir, getNativeResourcePath |
ModelParameters |
priority/penalty validation, enum-based setters, sampler formatting, isDefault, CliParameters.toString/toArray |
args/PoolingType |
getArgValue() for each constant |
args/RopeScalingType |
getArgValue() for each constant |
In src/main/java/de/kherud/llama/LlamaLoader.java change the following four
methods from private to package-private (remove the private modifier):
shouldCleanPath(Path)contentsEquals(InputStream, InputStream)getTempDir()getNativeResourcePath()
Create each file below. Follow the existing style exactly: JUnit 4,
import static org.junit.Assert.*, no Mockito, no model file required.
testConstructorSetsPrompt— constructor stores prompt as JSON stringtestConstructorWithEmptyPrompttestSetPromptOverridestestSetNPredict,testSetTemperature,testSetTopK,testSetTopP,testSetMinP,testSetTfsZ,testSetTypicalP,testSetRepeatLastN,testSetRepeatPenalty,testSetFrequencyPenalty,testSetPresencePenalty,testSetSeed,testSetNProbs,testSetMinKeep,testSetNKeep,testSetCachePrompt,testSetIgnoreEos,testSetPenalizeNl,testSetDynamicTemperatureRange,testSetDynamicTemperatureExponent— each verifies the correct map key and string valuetestSetInputPrefix,testSetInputSuffix,testSetGrammar,testSetPenaltyPromptString,testSetUseChatTemplate,testSetChatTemplatetestSetMiroStatDisabled,testSetMiroStatV1,testSetMiroStatV2,testSetMiroStatTau,testSetMiroStatEtatestSetStopStringsSingle,testSetStopStringsMultiple,testSetStopStringsEmptytestSetSamplersSingle,testSetSamplersMultiple,testSetSamplersMinP,testSetSamplersEmptytestSetTokenIdBias,testSetTokenIdBiasEmptytestSetTokenBias,testSetTokenBiasEmptytestDisableTokenIds,testDisableTokenIdsEmptytestDisableTokens,testDisableTokensEmptytestSetPenaltyPromptTokenIds,testSetPenaltyPromptTokenIdsEmptytestSetMessagesWithSystemAndUserMessages,testSetMessagesWithAssistantRole,testSetMessagesNoSystemMessage,testSetMessagesEmptySystemMessage,testSetMessagesInvalidRole— expectsIllegalArgumentException,testSetMessagesInvalidRoleOther— expectsIllegalArgumentExceptiontestToStringContainsPrompt,testToStringWithMultipleParamstestToJsonStringEscapesBackslash,testToJsonStringEscapesDoubleQuote,testToJsonStringEscapesNewline,testToJsonStringEscapesTab,testToJsonStringEscapesCarriageReturn,testToJsonStringNull,testToJsonStringEscapesSlashAfterLttestBuilderChainingReturnsSameInstancetestSetStreamTrue,testSetStreamFalsetestSetTokenIdBiasMultiple
testTextFromBytes—new LlamaOutput("hello".getBytes(UTF_8), emptyMap, false)→ text == "hello"testEmptyTexttestUtf8MultibyteText— round-trip with "héllo wörld"testProbabilitiesStored— map with 2 entriestestEmptyProbabilitiestestStopFlagFalse,testStopFlagTruetestToStringReturnsText,testToStringEmptyText
testMessageIsPreservedtestIsRuntimeExceptiontestEmptyMessagetestNullMessagetestCanBeThrown— use aboolean caughtflag, notreturninside catch (areturnfollowed byfail()is unreachable and fails to compile under-source 8)
Use @Before/@After to save and restore the system property
"de.kherud.llama.osinfo.architecture".
testTranslateWindowsXP,testTranslateWindows10→"Windows"testTranslateMacOSX,testTranslateDarwin→"Mac"testTranslateAIX→"AIX"testTranslateLinuxOnNonMuslNonAndroid— assert result is one of"Linux","Linux-Musl","Linux-Android"(environment-dependent)testTranslateUnknownOsStripsNonWordChars—"Some Unknown OS!"→"SomeUnknownOS"testTranslateArchStripsDots—"sparc.64"→"sparc64"testTranslateArchStripsHyphens—"aarch-64"→"aarch64"testTranslateArchNoSpecialChars,testTranslateArchEmptyStringtestGetArchNameWithOverride,testGetArchNameWithoutOverrideReturnsNonEmptytestGetNativeLibFolderPathContainsSlash,testGetNativeLibFolderPathHasTwoPartstestIsAndroidRuntimeFalseOnNonAndroid
Use @Before/@After to save and restore "de.kherud.llama.tmpdir".
testShouldCleanPathJllamaPrefix,testShouldCleanPathJllamaWithSuffixtestShouldCleanPathLlamaPrefix,testShouldCleanPathLlamaWithSuffixtestShouldCleanPathUnrelatedFile,testShouldCleanPathEmptyFilenametestShouldCleanPathPartialMatchInMiddle—"myjllama.so"→ falsetestShouldCleanPathCaseSensitive—"Jllama.so"→ falsetestContentsEqualsIdenticalContent,testContentsEqualsBothEmptytestContentsEqualsDifferentContent,testContentsEqualsFirstLonger,testContentsEqualsSecondLongertestContentsEqualsAlreadyBuffered— passBufferedInputStreamwrapperstestContentsEqualsDifferentAtFirstByte,testContentsEqualsSingleByteMatchtestGetTempDirDefaultsToJavaIoTmpdir— compareFileobjects, not raw strings (Windowsjava.io.tmpdirhas a trailing backslash thatFilestrips)testGetTempDirUsesOverrideProperty— set property tonew File(tmpdir, "llama-test-custom").getPath()and compareFileobjectstestGetNativeResourcePathStartsWithSlash,testGetNativeResourcePathContainsPackage,testGetNativeResourcePathContainsOsAndArch
testSetPriorityValid0,testSetPriorityValid3testSetPriorityNegative—@Test(expected = IllegalArgumentException.class)testSetPriorityTooHigh—@Test(expected = IllegalArgumentException.class)testSetPriorityBatchValid1,testSetPriorityBatchNegative,testSetPriorityBatchTooHightestSetRepeatLastNValidZero,testSetRepeatLastNValidMinusOne,testSetRepeatLastNValid64testSetRepeatLastNTooLow—@Test(expected = RuntimeException.class)testSetDryPenaltyLastNValidMinusOne,testSetDryPenaltyLastNValidZerotestSetDryPenaltyLastNTooLow—@Test(expected = RuntimeException.class)testSetSamplersSingle,testSetSamplersMultiple,testSetSamplersEmptytestSetSamplersAllLowercase— iterate allSamplervaluestestAddLoraScaledAdapter—"adapter.bin,0.5"testAddControlVectorScaled—"vec.bin,1.5"testSetControlVectorLayerRange—"2,10",testSetControlVectorLayerRangeSameStartEndtestIsDefaultTrueWhenNotSet,testIsDefaultFalseWhenSet,testIsDefaultFalseAfterFlagOnlytestSetPoolingType,testSetRopeScaling,testSetCacheTypeKLowercase,testSetCacheTypeVLowercase,testSetSplitModeLowercase,testSetNumaLowercase,testSetMirostatOrdinaltestToStringContainsKey,testToStringFlagOnlyNoValue,testToStringEmptytestToArrayEmptyParametersHasOneElement—toArray()always prepends""testToArrayScalarParameterHasThreeElements—["", "--threads", "4"]testToArrayFlagOnlyHasTwoElements—["", "--embedding"]testToArrayMultipleParameterstestBuilderChainingReturnsSameInstance
Test each of UNSPECIFIED, NONE, MEAN, CLS, LAST, RANK → their
getArgValue() string. Also verify values().length == 6.
Import de.kherud.llama.ClaudeGenerated.
Test each of UNSPECIFIED, NONE, LINEAR, YARN2 (→ "yarn"),
LONGROPE, MAX_VALUE (→ "maxvalue") → their getArgValue() string.
Also verify values().length == 6.
Import de.kherud.llama.ClaudeGenerated.
Add Assume.assumeTrue("Model file not found, skipping", new java.io.File("models/codellama-7b.Q2_K.gguf").exists())
as the first line of @BeforeClass setup() in LlamaModelTest.
This turns a hard error into a graceful skip on machines without the model.
Also add import org.junit.Assume;.
Run mvn test-compile and fix any issues:
- Unreachable statements (e.g.
fail()after a catch that always returns — use aboolean caughtflag instead). - Windows path comparisons: always compare
Fileobjects, never raw strings, becausejava.io.tmpdirmay have a trailing backslash and forward-slash literals are rewritten to backslashes byFile.
162 new tests across 8 new test classes, zero model-dependent failures.
All tests pass on Linux, macOS, and Windows with mvn test when the model
file is absent (LlamaModelTest is skipped, not errored).