View Javadoc
1   /*
2    * Licensed under the GPL License. You may not use this file except in compliance with the License.
3    * You may obtain a copy of the License at
4    *
5    *   https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
6    *
7    * THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
8    * WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
9    * PURPOSE.
10   */
11  package psiprobe.tools;
12  
13  import static org.junit.jupiter.api.Assertions.assertEquals;
14  import static org.junit.jupiter.api.Assertions.assertNull;
15  import static org.junit.jupiter.api.Assertions.assertTrue;
16  
17  import java.util.HashSet;
18  
19  import org.junit.jupiter.api.Assertions;
20  import org.junit.jupiter.api.Test;
21  
22  /**
23   * The Class InstrumentsTests.
24   */
25  class InstrumentsTests {
26  
27    /**
28     * Test object.
29     */
30    @Test
31    void objectTest() {
32      Object o = new Object();
33      long objectSize = Instruments.sizeOf(o);
34      Assertions.assertEquals(Instruments.SIZE_OBJECT, objectSize);
35    }
36  
37    /**
38     * Test boolean.
39     */
40    @Test
41    void booleanTest() {
42      boolean b = false;
43      long booleanSize = Instruments.sizeOf(Boolean.valueOf(b)) - Instruments.SIZE_OBJECT;
44      Assertions.assertEquals(Instruments.SIZE_BOOLEAN, booleanSize);
45    }
46  
47    /**
48     * Test byte.
49     */
50    @Test
51    void byteTest() {
52      byte b = 0x00;
53      long byteSize = Instruments.sizeOf(Byte.valueOf(b)) - Instruments.SIZE_OBJECT;
54      Assertions.assertEquals(Instruments.SIZE_BYTE, byteSize);
55    }
56  
57    /**
58     * Test char.
59     */
60    @Test
61    void charTest() {
62      char c = '\0';
63      long charSize = Instruments.sizeOf(Character.valueOf(c)) - Instruments.SIZE_OBJECT;
64      Assertions.assertEquals(Instruments.SIZE_CHAR, charSize);
65    }
66  
67    /**
68     * Test short.
69     */
70    @Test
71    void shortTest() {
72      short s = 0;
73      long shortSize = Instruments.sizeOf(Short.valueOf(s)) - Instruments.SIZE_OBJECT;
74      Assertions.assertEquals(Instruments.SIZE_SHORT, shortSize);
75    }
76  
77    /**
78     * Test int.
79     */
80    @Test
81    void intTest() {
82      int i = 0;
83      long intSize = Instruments.sizeOf(Integer.valueOf(i)) - Instruments.SIZE_OBJECT;
84      Assertions.assertEquals(Instruments.SIZE_INT, intSize);
85    }
86  
87    /**
88     * Test long.
89     */
90    @Test
91    void longTest() {
92      long l = 0;
93      long longSize = Instruments.sizeOf(Long.valueOf(l)) - Instruments.SIZE_OBJECT;
94      Assertions.assertEquals(Instruments.SIZE_LONG, longSize);
95    }
96  
97    /**
98     * Test float.
99     */
100   @Test
101   void floatTest() {
102     float f = 0.0F;
103     long floatSize = Instruments.sizeOf(Float.valueOf(f)) - Instruments.SIZE_OBJECT;
104     Assertions.assertEquals(Instruments.SIZE_FLOAT, floatSize);
105   }
106 
107   /**
108    * Test double.
109    */
110   @Test
111   void doubleTest() {
112     double d = 0.0;
113     long doubleSize = Instruments.sizeOf(Double.valueOf(d)) - Instruments.SIZE_OBJECT;
114     Assertions.assertEquals(Instruments.SIZE_DOUBLE, doubleSize);
115   }
116 
117   @Test
118   void testSizeOfNull() {
119     // sizeOf(null) should return 0 (null is skipped)
120     long size = Instruments.sizeOf(null);
121     assertEquals(0L, size);
122   }
123 
124   @Test
125   void testSizeOfWithClassLoader() {
126     Object o = new Object();
127     long size = Instruments.sizeOf(o, o.getClass().getClassLoader());
128     assertTrue(size >= 0);
129   }
130 
131   @Test
132   void testSizeOfWithPreexistingSet() {
133     Object o = new Object();
134     long size = Instruments.sizeOf(o, new HashSet<>());
135     assertTrue(size >= 0);
136   }
137 
138   @Test
139   void testIsInitialized() {
140     assertTrue(Instruments.isInitialized());
141   }
142 
143   @Test
144   void testGetFieldExisting() {
145     // Use our own class with accessible field
146     class Container {
147       String value = "hello";
148     }
149     Container c = new Container();
150     Object val = Instruments.getField(c, "value");
151     assertEquals("hello", val);
152   }
153 
154   @Test
155   void testGetFieldNonExistent() {
156     Object o = new Object();
157     Object val = Instruments.getField(o, "nonExistentField");
158     assertNull(val);
159   }
160 
161   @Test
162   void testFindFieldInSuperclass() {
163     // Create an object where the field is in the superclass
164     class Parent {
165       String parentField = "parent";
166     }
167     class Child extends Parent {
168       String childField = "child";
169     }
170     Child child = new Child();
171     Object val = Instruments.getField(child, "parentField");
172     assertEquals("parent", val);
173   }
174 
175   @Test
176   void testSizeOfPrimitiveIntArray() {
177     int[] arr = {1, 2, 3, 4, 5};
178     long size = Instruments.sizeOf(arr);
179     // primitive int array: 5 * SIZE_INT
180     assertEquals(5 * Instruments.SIZE_INT, size);
181   }
182 
183   @Test
184   void testSizeOfBooleanArray() {
185     boolean[] arr = {true, false, true};
186     long size = Instruments.sizeOf(arr);
187     assertEquals(3 * Instruments.SIZE_BOOLEAN, size);
188   }
189 
190   @Test
191   void testSizeReferenceIsPositive() {
192     assertTrue(Instruments.SIZE_REFERENCE > 0);
193   }
194 
195   @Test
196   void testSizeOfComplexObject() {
197     // A simple object with primitive fields
198     class SimpleData {
199       int x = 42;
200       long y = 100L;
201     }
202     SimpleData data = new SimpleData();
203     long size = Instruments.sizeOf(data);
204     // At minimum should include SIZE_OBJECT + primitives
205     assertTrue(size >= Instruments.SIZE_OBJECT + Instruments.SIZE_INT + Instruments.SIZE_LONG);
206   }
207 }