1 /* 2 * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* 25 * @test 26 * @run testng/othervm MemoryLayoutTypeRetentionTest 27 */ 28 29 import org.testng.annotations.*; 30 31 import java.lang.foreign.*; 32 import java.nio.ByteOrder; 33 34 import static java.lang.foreign.ValueLayout.*; 35 import static org.testng.Assert.*; 36 37 public class MemoryLayoutTypeRetentionTest { 38 39 // These tests check both compile-time and runtime properties. 40 // withName() et al. should return the same type as the original object. 41 42 private static final String NAME = "a"; 43 private static final long BYTE_ALIGNMENT = Byte.BYTES; 44 private static final ByteOrder BYTE_ORDER = ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN 45 ? ByteOrder.LITTLE_ENDIAN 46 : ByteOrder.BIG_ENDIAN; 47 48 @Test 49 public void testOfBoolean() { 50 OfBoolean v = JAVA_BOOLEAN 51 .withByteAlignment(BYTE_ALIGNMENT) 52 .withoutName() 53 .withName(NAME) 54 .withOrder(BYTE_ORDER); 55 check(v); 56 } 57 58 @Test 59 public void testOfByte() { 60 OfByte v = JAVA_BYTE 61 .withByteAlignment(BYTE_ALIGNMENT) 62 .withoutName() 63 .withName(NAME) 64 .withOrder(BYTE_ORDER); 65 check(v); 66 } 67 68 @Test 69 public void testOfShort() { 70 OfShort v = JAVA_SHORT 71 .withByteAlignment(BYTE_ALIGNMENT) 72 .withoutName() 73 .withName(NAME) 74 .withOrder(BYTE_ORDER); 75 check(v); 76 } 77 78 @Test 79 public void testOfInt() { 80 OfInt v = JAVA_INT 81 .withByteAlignment(BYTE_ALIGNMENT) 82 .withoutName() 83 .withName(NAME) 84 .withOrder(BYTE_ORDER); 85 check(v); 86 } 87 88 @Test 89 public void testOfChar() { 90 OfChar v = JAVA_CHAR 91 .withByteAlignment(BYTE_ALIGNMENT) 92 .withoutName() 93 .withName(NAME) 94 .withOrder(BYTE_ORDER); 95 check(v); 96 } 97 98 @Test 99 public void testOfLong() { 100 OfLong v = JAVA_LONG 101 .withByteAlignment(BYTE_ALIGNMENT) 102 .withoutName() 103 .withName(NAME) 104 .withOrder(BYTE_ORDER); 105 check(v); 106 } 107 108 @Test 109 public void testOfFloat() { 110 OfFloat v = JAVA_FLOAT 111 .withByteAlignment(BYTE_ALIGNMENT) 112 .withoutName() 113 .withName(NAME) 114 .withOrder(BYTE_ORDER); 115 check(v); 116 } 117 118 @Test 119 public void testOfDouble() { 120 OfDouble v = JAVA_DOUBLE 121 .withByteAlignment(BYTE_ALIGNMENT) 122 .withoutName() 123 .withName(NAME) 124 .withOrder(BYTE_ORDER); 125 check(v); 126 } 127 128 @Test 129 public void testValueLayout() { 130 ValueLayout v = ((ValueLayout) JAVA_INT) 131 .withByteAlignment(BYTE_ALIGNMENT) 132 .withoutName() 133 .withName(NAME) 134 .withOrder(BYTE_ORDER); 135 check(v); 136 } 137 138 @Test 139 public void testAddressLayout() { 140 AddressLayout v = ADDRESS 141 .withByteAlignment(BYTE_ALIGNMENT) 142 .withoutName() 143 .withName(NAME) 144 .withoutTargetLayout() 145 .withOrder(BYTE_ORDER); 146 check(v); 147 assertEquals(v.order(), BYTE_ORDER); 148 149 assertFalse(v.targetLayout().isPresent()); 150 AddressLayout v2 = v.withTargetLayout(JAVA_INT); 151 assertTrue(v2.targetLayout().isPresent()); 152 assertEquals(v2.targetLayout().get(), JAVA_INT); 153 assertTrue(v2.withoutTargetLayout().targetLayout().isEmpty()); 154 } 155 156 @Test 157 public void testPaddingLayout() { 158 PaddingLayout v = MemoryLayout.paddingLayout(1) 159 .withByteAlignment(BYTE_ALIGNMENT) 160 .withoutName() 161 .withName(NAME); 162 check(v); 163 } 164 165 @Test 166 public void testGroupLayout() { 167 GroupLayout v = MemoryLayout.structLayout( 168 JAVA_INT.withByteAlignment(BYTE_ALIGNMENT), 169 JAVA_LONG.withByteAlignment(BYTE_ALIGNMENT)) 170 .withByteAlignment(BYTE_ALIGNMENT) 171 .withoutName() 172 .withName(NAME); 173 check(v); 174 } 175 176 @Test 177 public void testStructLayout() { 178 StructLayout v = MemoryLayout.structLayout( 179 JAVA_INT.withByteAlignment(BYTE_ALIGNMENT), 180 JAVA_LONG.withByteAlignment(BYTE_ALIGNMENT)) 181 .withByteAlignment(BYTE_ALIGNMENT) 182 .withoutName() 183 .withName(NAME); 184 check(v); 185 } 186 187 @Test 188 public void testUnionLayout() { 189 UnionLayout v = MemoryLayout.unionLayout( 190 JAVA_INT.withByteAlignment(BYTE_ALIGNMENT), 191 JAVA_LONG.withByteAlignment(BYTE_ALIGNMENT)) 192 .withByteAlignment(BYTE_ALIGNMENT) 193 .withoutName() 194 .withName(NAME); 195 check(v); 196 } 197 198 public void check(ValueLayout v) { 199 check((MemoryLayout) v); 200 assertEquals(v.order(), BYTE_ORDER); 201 } 202 203 public void check(MemoryLayout v) { 204 // Check name properties 205 assertEquals(v.name().orElseThrow(), NAME); 206 assertTrue(v.withoutName().name().isEmpty()); 207 208 assertEquals(v.byteAlignment(), BYTE_ALIGNMENT); 209 } 210 211 }