1 /*
   2  * Copyright (c) 2018, 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 import java.foreign.Libraries;
  25 import java.foreign.Library;
  26 import java.lang.invoke.MethodHandles;
  27 import java.util.List;
  28 import org.testng.annotations.Test;
  29 import test.jextract.enums.enums_h;
  30 
  31 import static org.testng.Assert.assertEquals;
  32 import static test.jextract.enums.enums_lib.*;
  33 
  34 /*
  35  * @test
  36  * @bug 8210935 8218763
  37  * @summary C enum constants should be mapped to interface methods instead of static final int constants
  38  * @library ..
  39  * @run driver JtregJextract -t test.jextract.enums -l libEnums -- enums.h
  40  * @run testng LibEnumsTest
  41  */
  42 public class LibEnumsTest {
  43     static final enums_h libEnums;
  44 
  45     static {
  46         Library lib = Libraries.loadLibrary(MethodHandles.lookup(), "Enums");
  47         libEnums = Libraries.bind(enums_h.class, lib);
  48     }
  49 
  50     @Test
  51     public void testEnumConstants() {
  52         assertEquals(libEnums.R(), 0xFF0000);
  53         assertEquals(libEnums.G(), 0x00FF00);
  54         assertEquals(libEnums.B(), 0x0000FF);
  55 
  56         assertEquals(libEnums.R() | libEnums.G(), libEnums.red_green());
  57         assertEquals(libEnums.G() | libEnums.B(), libEnums.green_blue());
  58         assertEquals(libEnums.R() | libEnums.G() | libEnums.B(), libEnums.red_green_blue());
  59 
  60         assertEquals(libEnums.i_value1_func(), libEnums.I_VALUE1());
  61         assertEquals(libEnums.i_value2_func(), libEnums.I_VALUE2());
  62         assertEquals(libEnums.l_value1_func(), libEnums.L_VALUE1());
  63         assertEquals(libEnums.l_value2_func(), libEnums.L_VALUE2());
  64     }
  65 
  66     @Test
  67     public void testSwitchOnEnum() {
  68         for (int c: List.of(0xFF0000, 0x00FF00, 0x0000FF)) {
  69             switch (c) {
  70                 case Color.R:
  71                     assertEquals(c, libEnums.R());
  72                     break;
  73                 case Color.G:
  74                     assertEquals(c, libEnums.G());
  75                     break;
  76                 case Color.B:
  77                     assertEquals(c, libEnums.B());
  78                     break;
  79             }
  80         }
  81     }
  82 }