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 }