@@ -53,4 +53,101 @@ void registerHints() {
53
53
assertThat (registeredTypes .contains (TypeReference .of (OllamaOptions .class ))).isTrue ();
54
54
}
55
55
56
+ @ Test
57
+ void registerHintsWithNullClassLoader () {
58
+ RuntimeHints runtimeHints = new RuntimeHints ();
59
+ OllamaRuntimeHints ollamaRuntimeHints = new OllamaRuntimeHints ();
60
+
61
+ // Should not throw exception with null ClassLoader
62
+ org .assertj .core .api .Assertions .assertThatCode (() -> ollamaRuntimeHints .registerHints (runtimeHints , null ))
63
+ .doesNotThrowAnyException ();
64
+ }
65
+
66
+ @ Test
67
+ void ensureReflectionHintsAreRegistered () {
68
+ RuntimeHints runtimeHints = new RuntimeHints ();
69
+ OllamaRuntimeHints ollamaRuntimeHints = new OllamaRuntimeHints ();
70
+ ollamaRuntimeHints .registerHints (runtimeHints , null );
71
+
72
+ // Ensure reflection hints are properly registered
73
+ assertThat (runtimeHints .reflection ().typeHints ().spliterator ().estimateSize ()).isGreaterThan (0 );
74
+ }
75
+
76
+ @ Test
77
+ void verifyMultipleRegistrationCallsAreIdempotent () {
78
+ RuntimeHints runtimeHints = new RuntimeHints ();
79
+ OllamaRuntimeHints ollamaRuntimeHints = new OllamaRuntimeHints ();
80
+
81
+ // Register hints multiple times
82
+ ollamaRuntimeHints .registerHints (runtimeHints , null );
83
+ long firstCount = runtimeHints .reflection ().typeHints ().spliterator ().estimateSize ();
84
+
85
+ ollamaRuntimeHints .registerHints (runtimeHints , null );
86
+ long secondCount = runtimeHints .reflection ().typeHints ().spliterator ().estimateSize ();
87
+
88
+ // Should not register duplicate hints
89
+ assertThat (firstCount ).isEqualTo (secondCount );
90
+ }
91
+
92
+ @ Test
93
+ void verifyMainApiClassesRegistered () {
94
+ RuntimeHints runtimeHints = new RuntimeHints ();
95
+ OllamaRuntimeHints ollamaRuntimeHints = new OllamaRuntimeHints ();
96
+ ollamaRuntimeHints .registerHints (runtimeHints , null );
97
+
98
+ Set <TypeReference > registeredTypes = new HashSet <>();
99
+ runtimeHints .reflection ().typeHints ().forEach (typeHint -> registeredTypes .add (typeHint .getType ()));
100
+
101
+ // Verify that the main classes we already know exist are registered
102
+ assertThat (registeredTypes .contains (TypeReference .of (OllamaApi .ChatRequest .class ))).isTrue ();
103
+ assertThat (registeredTypes .contains (TypeReference .of (OllamaApi .Message .class ))).isTrue ();
104
+ assertThat (registeredTypes .contains (TypeReference .of (OllamaOptions .class ))).isTrue ();
105
+ }
106
+
107
+ @ Test
108
+ void verifyJsonAnnotatedClassesFromCorrectPackage () {
109
+ Set <TypeReference > jsonAnnotatedClasses = findJsonAnnotatedClassesInPackage ("org.springframework.ai.ollama" );
110
+
111
+ // Ensure we found some JSON annotated classes in the expected package
112
+ assertThat (jsonAnnotatedClasses .spliterator ().estimateSize ()).isGreaterThan (0 );
113
+
114
+ // Verify all found classes are from the expected package
115
+ for (TypeReference classRef : jsonAnnotatedClasses ) {
116
+ assertThat (classRef .getName ()).startsWith ("org.springframework.ai.ollama" );
117
+ }
118
+ }
119
+
120
+ @ Test
121
+ void verifyNoUnnecessaryHintsRegistered () {
122
+ RuntimeHints runtimeHints = new RuntimeHints ();
123
+ OllamaRuntimeHints ollamaRuntimeHints = new OllamaRuntimeHints ();
124
+ ollamaRuntimeHints .registerHints (runtimeHints , null );
125
+
126
+ Set <TypeReference > jsonAnnotatedClasses = findJsonAnnotatedClassesInPackage ("org.springframework.ai.ollama" );
127
+
128
+ Set <TypeReference > registeredTypes = new HashSet <>();
129
+ runtimeHints .reflection ().typeHints ().forEach (typeHint -> registeredTypes .add (typeHint .getType ()));
130
+
131
+ // Ensure we don't register significantly more types than needed
132
+ // Allow for some additional utility types but prevent hint bloat
133
+ assertThat (registeredTypes .size ()).isLessThanOrEqualTo (jsonAnnotatedClasses .size () + 15 );
134
+ }
135
+
136
+ @ Test
137
+ void verifyNestedClassHintsAreRegistered () {
138
+ RuntimeHints runtimeHints = new RuntimeHints ();
139
+ OllamaRuntimeHints ollamaRuntimeHints = new OllamaRuntimeHints ();
140
+ ollamaRuntimeHints .registerHints (runtimeHints , null );
141
+
142
+ Set <TypeReference > registeredTypes = new HashSet <>();
143
+ runtimeHints .reflection ().typeHints ().forEach (typeHint -> registeredTypes .add (typeHint .getType ()));
144
+
145
+ // Verify nested classes that we know exist from the original test
146
+ assertThat (registeredTypes .contains (TypeReference .of (OllamaApi .ChatRequest .Tool .class ))).isTrue ();
147
+
148
+ // Count nested classes to ensure comprehensive registration
149
+ long nestedClassCount = registeredTypes .stream ().filter (typeRef -> typeRef .getName ().contains ("$" )).count ();
150
+ assertThat (nestedClassCount ).isGreaterThan (0 );
151
+ }
152
+
56
153
}
0 commit comments