/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.felix.framework.util.manifestparser;

import junit.framework.TestCase;

public class NativeLibraryClauseTest extends TestCase {
    public void testNormalizeOSName() {
        assertEquals("win32", NativeLibraryClause.normalizeOSName("win 32"));
        assertEquals("win32", NativeLibraryClause.normalizeOSName("Win*"));
        assertEquals("win32", NativeLibraryClause.normalizeOSName("Windows NonExistingFutureVersion 4711"));
        assertEquals("windows95", NativeLibraryClause.normalizeOSName("Windows 95"));
        assertEquals("windows98", NativeLibraryClause.normalizeOSName("Windows 98"));
        assertEquals("windowsnt", NativeLibraryClause.normalizeOSName("WinNT"));
        assertEquals("windows2000", NativeLibraryClause.normalizeOSName("Win2000"));
        assertEquals("windows2003", NativeLibraryClause.normalizeOSName("Win2003"));
        assertEquals("windowsserver2008", NativeLibraryClause.normalizeOSName("Windows Server 2008"));
        assertEquals("windowsserver2012", NativeLibraryClause.normalizeOSName("Windows Server 2012"));
        assertEquals("windowsserver2016", NativeLibraryClause.normalizeOSName("Windows Server 2016"));
        assertEquals("windowsxp", NativeLibraryClause.normalizeOSName("WinXP"));
        assertEquals("windowsce", NativeLibraryClause.normalizeOSName("WinCE"));
        assertEquals("windowsvista", NativeLibraryClause.normalizeOSName("WinVista"));
        assertEquals("windows7", NativeLibraryClause.normalizeOSName("Windows 7"));
        assertEquals("windows8", NativeLibraryClause.normalizeOSName("Win8"));
        assertEquals("windows10", NativeLibraryClause.normalizeOSName("Windows 10"));
        assertEquals("linux", NativeLibraryClause.normalizeOSName("Linux1.2.3"));
        assertEquals("aix", NativeLibraryClause.normalizeOSName("AIX-4.5.6"));
        assertEquals("digitalunix", NativeLibraryClause.normalizeOSName("digitalunix_blah"));
        assertEquals("hpux", NativeLibraryClause.normalizeOSName("HPUX-999"));
        assertEquals("irix", NativeLibraryClause.normalizeOSName("Irixxxx"));
        assertEquals("macosx", NativeLibraryClause.normalizeOSName("mac OS X"));
        assertEquals("netware", NativeLibraryClause.normalizeOSName("Netware"));
        assertEquals("openbsd", NativeLibraryClause.normalizeOSName("OpenBSD-0000"));
        assertEquals("netbsd", NativeLibraryClause.normalizeOSName("netbsd "));
        assertEquals("os2", NativeLibraryClause.normalizeOSName("os/2"));
        assertEquals("qnx", NativeLibraryClause.normalizeOSName("procnto"));
        assertEquals("solaris", NativeLibraryClause.normalizeOSName("Solaris 9"));
        assertEquals("sunos", NativeLibraryClause.normalizeOSName("SunOS8"));
        assertEquals("vxworks", NativeLibraryClause.normalizeOSName("VxWorks"));

        // Try all the already normalized names
        assertEquals("aix", NativeLibraryClause.normalizeOSName("aix"));
        assertEquals("digitalunix", NativeLibraryClause.normalizeOSName("digitalunix"));
        assertEquals("hpux", NativeLibraryClause.normalizeOSName("hpux"));
        assertEquals("irix", NativeLibraryClause.normalizeOSName("irix"));
        assertEquals("linux", NativeLibraryClause.normalizeOSName("linux"));
        assertEquals("macos", NativeLibraryClause.normalizeOSName("macos"));
        assertEquals("netbsd", NativeLibraryClause.normalizeOSName("netbsd"));
        assertEquals("netware", NativeLibraryClause.normalizeOSName("netware"));
        assertEquals("openbsd", NativeLibraryClause.normalizeOSName("openbsd"));
        assertEquals("os2", NativeLibraryClause.normalizeOSName("os2"));
        assertEquals("qnx", NativeLibraryClause.normalizeOSName("qnx"));
        assertEquals("solaris", NativeLibraryClause.normalizeOSName("solaris"));
        assertEquals("sunos", NativeLibraryClause.normalizeOSName("sunos"));
        assertEquals("vxworks", NativeLibraryClause.normalizeOSName("vxworks"));
        assertEquals("windows2000", NativeLibraryClause.normalizeOSName("windows2000"));
        assertEquals("windows2003", NativeLibraryClause.normalizeOSName("windows2003"));
        assertEquals("windows7", NativeLibraryClause.normalizeOSName("windows7"));
        assertEquals("windows8", NativeLibraryClause.normalizeOSName("windows8"));
        assertEquals("windows9", NativeLibraryClause.normalizeOSName("windows9"));
        assertEquals("windows10", NativeLibraryClause.normalizeOSName("windows10"));
        assertEquals("windows95", NativeLibraryClause.normalizeOSName("windows95"));
        assertEquals("windows98", NativeLibraryClause.normalizeOSName("windows98"));
        assertEquals("windowsce", NativeLibraryClause.normalizeOSName("windowsce"));
        assertEquals("windowsnt", NativeLibraryClause.normalizeOSName("windowsnt"));
        assertEquals("windowsserver2008", NativeLibraryClause.normalizeOSName("windowsserver2008"));
        assertEquals("windowsserver2012", NativeLibraryClause.normalizeOSName("windowsserver2012"));
        assertEquals("windowsvista", NativeLibraryClause.normalizeOSName("windowsvista"));
        assertEquals("windowsxp", NativeLibraryClause.normalizeOSName("windowsxp"));
        assertEquals("win32", NativeLibraryClause.normalizeOSName("win32"));
    }

    public void testgetOsNameWithAliases() {
        assertTrue(NativeLibraryClause.getOsNameWithAliases("win 32").contains("win32"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("Win*").contains("win32"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("Windows 95").contains("windows95"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("Windows 98").contains("windows98"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("WinNT").contains("windowsnt"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("Win2000").contains("windows2000"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("Win2003").contains("windows2003"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("Windows Server 2008").contains("windowsserver2008"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("Windows Server 2012").contains("windowsserver2012"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("WinXP").contains("windowsxp"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("WinCE").contains("windowsce"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("WinVista").contains("windowsvista"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("Windows 7").contains("windows7"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("Windows7").contains("windows7"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("Win8").contains("windows8"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("Windows 10").contains("windows10"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("Linux1.2.3").contains("linux"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("AIX-4.5.6").contains("aix"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("digitalunix_blah").contains("digitalunix"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("HPUX-999").contains("hpux"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("Irixxxx").contains("irix"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("mac OS X").contains("mac os x"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("Netware").contains("netware"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("OpenBSD-0000").contains("openbsd"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("netbsd ").contains("netbsd"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("os/2").contains("os2"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("procnto").contains("qnx"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("Solaris 9").contains("solaris"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("SunOS8").contains("sunos"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("VxWorks").contains("vxworks"));

        // Try all the already normalized names
        assertTrue(NativeLibraryClause.getOsNameWithAliases("aix").contains("aix"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("digitalunix").contains("digitalunix"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("hpux").contains("hpux"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("irix").contains("irix"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("linux").contains("linux"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("mac os").contains("mac os"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("netbsd").contains("netbsd"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("netware").contains("netware"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("openbsd").contains("openbsd"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("os2").contains("os2"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("qnx").contains("qnx"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("solaris").contains("solaris"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("sunos").contains("sunos"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("vxworks").contains("vxworks"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("windows2000").contains("windows2000"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("windows2003").contains("windows2003"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("windows7").contains("windows7"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("windows8").contains("windows8"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("windows9").contains("windows9"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("windows10").contains("windows10"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("windows95").contains("windows95"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("windows98").contains("windows98"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("windowsce").contains("windowsce"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("windowsnt").contains("windowsnt"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("windowsserver2008").contains("windowsserver2008"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("windowsserver2012").contains("windowsserver2012"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("windowsvista").contains("windowsvista"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("windowsxp").contains("windowsxp"));
        assertTrue(NativeLibraryClause.getOsNameWithAliases("win32").contains("win32"));
    }

    public void testNormalizeOSVersion() {
        // valid
        assertEquals("1.0.0", NativeLibraryClause.normalizeOSVersion("1"));
        assertEquals("1.2.0", NativeLibraryClause.normalizeOSVersion("1.2"));
        assertEquals("1.2.3", NativeLibraryClause.normalizeOSVersion("1.2.3"));
        assertEquals("1.2.3.qualifier", NativeLibraryClause.normalizeOSVersion("1.2.3.qualifier"));

        // to normalize
        assertEquals("1.0.0.qualifier", NativeLibraryClause.normalizeOSVersion("1.qualifier"));
        assertEquals("1.2.0.qualifier", NativeLibraryClause.normalizeOSVersion("1.2.qualifier"));

        assertEquals("3.13.0.39-generic", NativeLibraryClause.normalizeOSVersion("3.13.0-39-generic"));

        assertEquals("3.14.22.100_fc19_i686_PAE", NativeLibraryClause.normalizeOSVersion("3.14.22-100.fc19.i686.PAE"));
        assertEquals("4.9.35", NativeLibraryClause.normalizeOSVersion("4.9.35+"));
        assertEquals("4.9.0", NativeLibraryClause.normalizeOSVersion("4.9+"));
        assertEquals("4.0.0", NativeLibraryClause.normalizeOSVersion("4+"));
    }
}
