/**
 *
 * Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
 *
 * ====================================================================
 * Licensed 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.jclouds.vcloud.terremark.compute.functions;

import static org.testng.Assert.assertEquals;

import java.io.InputStream;
import java.util.Map;
import java.util.Set;

import org.jclouds.compute.domain.OperatingSystem;
import org.jclouds.compute.domain.OsFamily;
import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.http.functions.ParseSax;
import org.jclouds.http.functions.ParseSax.Factory;
import org.jclouds.http.functions.config.SaxParserModule;
import org.jclouds.json.Json;
import org.jclouds.json.config.GsonModule;
import org.jclouds.vcloud.xml.VCloudExpressCatalogHandler;
import org.testng.annotations.Test;

import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.TypeLiteral;

/**
 * @author Adrian Cole
 */
@Test(groups = "unit", testName = "TerremarkECloudParseOsFromVAppTemplateNameTest")
public class TerremarkECloudParseOsFromVAppTemplateNameTest {

   public Set<String> parseNames(String resource) {
      InputStream is = getClass().getResourceAsStream(resource);
      Injector injector = Guice.createInjector(new SaxParserModule());
      Factory factory = injector.getInstance(ParseSax.Factory.class);
      return factory.create(injector.getInstance(VCloudExpressCatalogHandler.class)).parse(is).keySet();
   }

   public void test() {

      TerremarkECloudParseOsFromVAppTemplateName function = new TerremarkECloudParseOsFromVAppTemplateName(Guice
               .createInjector(new GsonModule()).getInstance(Json.class).<Map<OsFamily, Map<String, String>>> fromJson(
                        new ComputeServiceConstants.ReferenceData().osVersionMapJson,
                        new TypeLiteral<Map<OsFamily, Map<String, String>>>() {
                        }.getType()));
      Set<String> names = parseNames("/catalog-ecloud.xml");
      assertEquals(Sets.newLinkedHashSet(Iterables.transform(names, function)), ImmutableSet.of(

      // CentOS 5 (x64)
               new OperatingSystem.Builder().family(OsFamily.CENTOS).version("5.0").description("CentOS 5 (x64)")
                        .is64Bit(true).build(),
               // CentOS 5 (x86)
               new OperatingSystem.Builder().family(OsFamily.CENTOS).version("5.0").description("CentOS 5 (x86)")
                        .is64Bit(false).build(),
               // CentOS 5.5 x32
               new OperatingSystem.Builder().family(OsFamily.CENTOS).version("5.5").description("CentOS 5.5 x32")
                        .is64Bit(false).build(),
               // CentOS 5.5 x64
               new OperatingSystem.Builder().family(OsFamily.CENTOS).version("5.5").description("CentOS 5.5 x64")
                        .is64Bit(true).build(),
               // Red Hat Enterprise Linux 5 (x64)
               new OperatingSystem.Builder().family(OsFamily.RHEL).version("5.0").description(
                        "Red Hat Enterprise Linux 5 (x64)").is64Bit(true).build(),
               // Red Hat Enterprise Linux 5 (x86)
               new OperatingSystem.Builder().family(OsFamily.RHEL).version("5.0").description(
                        "Red Hat Enterprise Linux 5 (x86)").is64Bit(false).build(),
               // Red Hat Enterprise Linux 5.5 x32
               new OperatingSystem.Builder().family(OsFamily.RHEL).version("5.5").description(
                        "Red Hat Enterprise Linux 5.5 x32").is64Bit(false).build(),
               // Red Hat Enterprise Linux 5.5 x64
               new OperatingSystem.Builder().family(OsFamily.RHEL).version("5.5").description(
                        "Red Hat Enterprise Linux 5.5 x64").is64Bit(true).build(),
               // Sun Solaris 10 (x64)
               new OperatingSystem.Builder().family(OsFamily.SOLARIS).version("10").description("Sun Solaris 10 (x64)")
                        .is64Bit(true).build(),
               // Ubuntu 8.04 LTS (x64)
               new OperatingSystem.Builder().family(OsFamily.UBUNTU).version("8.04")
                        .description("Ubuntu 8.04 LTS (x64)").is64Bit(true).build(),
               // Ubuntu 8.04 LTS (x86)
               new OperatingSystem.Builder().family(OsFamily.UBUNTU).version("8.04")
                        .description("Ubuntu 8.04 LTS (x86)").is64Bit(false).build(),
               // Ubuntu Server 10.04 x32
               new OperatingSystem.Builder().family(OsFamily.UBUNTU).version("10.04").description(
                        "Ubuntu Server 10.04 x32").is64Bit(false).build(),
               // Ubuntu Server 10.04 x64
               new OperatingSystem.Builder().family(OsFamily.UBUNTU).version("10.04").description(
                        "Ubuntu Server 10.04 x64").is64Bit(true).build(),
               // -Windows 2003 Std. R2 SQL 2005 Std. (x64)
               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2003 R2").description(
                        "-Windows 2003 Std. R2 SQL 2005 Std. (x64)").is64Bit(true).build(),
               // -Windows 2003 Std. R2 SQL 2008 Std. (x64)
               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2003 R2").description(
                        "-Windows 2003 Std. R2 SQL 2008 Std. (x64)").is64Bit(true).build(),
               // -Windows 2008 R2 Std wSQL 2008 R2 Std (x64)
               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2008 R2").description(
                        "-Windows 2008 R2 Std wSQL 2008 R2 Std (x64)").is64Bit(true).build(),
               // -Windows 2008 R2 Std wSQL 2008 R2 Web (x64)
               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2008 R2").description(
                        "-Windows 2008 R2 Std wSQL 2008 R2 Web (x64)").is64Bit(true).build(),
               // -Windows 2008 Std wSQL 2008 Std (x64)
               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2008").description(
                        "-Windows 2008 Std wSQL 2008 Std (x64)").is64Bit(true).build(),
               // -Windows 2008 Std wSQL 2008 Web (x64)
               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2008").description(
                        "-Windows 2008 Std wSQL 2008 Web (x64)").is64Bit(true).build(),
               // -Windows Server 2003 R2 Enterprise Edition (x64)
               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2003 R2").description(
                        "-Windows Server 2003 R2 Enterprise Edition (x64)").is64Bit(true).build(),
               // -Windows Server 2003 R2 Enterprise Edition (x86)
               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2003 R2").description(
                        "-Windows Server 2003 R2 Enterprise Edition (x86)").is64Bit(false).build(),
               // -Windows Server 2003 R2 Standard Edition (x64)
               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2003 R2").description(
                        "-Windows Server 2003 R2 Standard Edition (x64)").is64Bit(true).build(),
               // -Windows Server 2003 R2 Standard Edition (x86)
               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2003 R2").description(
                        "-Windows Server 2003 R2 Standard Edition (x86)").is64Bit(false).build(),
               // -Windows Server 2008 Enterprise Edition (x64)
               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2008").description(
                        "-Windows Server 2008 Enterprise Edition (x64)").is64Bit(true).build(),
               // -Windows Server 2008 Enterprise Edition (x86)
               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2008").description(
                        "-Windows Server 2008 Enterprise Edition (x86)").is64Bit(false).build(),
               // -Windows Server 2008 R2 Enterprise Edition (x64)
               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2008 R2").description(
                        "-Windows Server 2008 R2 Enterprise Edition (x64)").is64Bit(true).build(),
               // -Windows Server 2008 R2 Standard Edition (x64)
               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2008 R2").description(
                        "-Windows Server 2008 R2 Standard Edition (x64)").is64Bit(true).build(),
               // -Windows Server 2008 R2 Web Edition (x64)
               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2008 R2").description(
                        "-Windows Server 2008 R2 Web Edition (x64)").is64Bit(true).build(),
               // -Windows Server 2008 Standard Edition (x64)
               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2008").description(
                        "-Windows Server 2008 Standard Edition (x64)").is64Bit(true).build(),
               // -Windows Server 2008 Standard Edition (x86)
               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2008").description(
                        "-Windows Server 2008 Standard Edition (x86)").is64Bit(false).build(),
               // -Windows Server 2008 Web Edition (x64)
               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2008").description(
                        "-Windows Server 2008 Web Edition (x64)").is64Bit(true).build(),
               // -Windows Server 2008 Web Edition (x86)
               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2008").description(
                        "-Windows Server 2008 Web Edition (x86)").is64Bit(false).build()

      ));

   }
}
