package org.apache.samoa.instances;

/*
 * #%L
 * SAMOA
 * %%
 * Copyright (C) 2014 - 2015 Apache Software Foundation
 * %%
 * 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.
 * #L%
 */

import org.apache.samoa.instances.ArffLoader;
import org.apache.samoa.instances.Instance;
import org.apache.samoa.instances.InstanceInformation;
import org.junit.Before;
import org.junit.Test;

import java.io.StringReader;

import static org.junit.Assert.assertEquals;

public class ArffLoaderTest {

  private ArffLoader loader;

  private StringReader reader;

  @Before
  public void setUp() {
    String inputString = "@relation test.txt\n"
                         + "\n"
                         + "@attribute Dur numeric\n"
                         + "@attribute Proto {udp,tcp,icmp,arp,ipx/spx,ipv6-icmp,pim,esp,igmp,rtcp,rtp,ipv6,udt}\n"
                         + "@attribute Dir {' <->',' <?>',' ->',' ?>',' who',' <-',' <?'}\n"
                         + "@attribute State {CON,PA_PA,PA_FRA, ...}\n"
                         + "@attribute sTos numeric\n"
                         + "@attribute dTos numeric\n"
                         + "@attribute TotPkts numeric\n"
                         + "@attribute TotBytes numeric\n"
                         + "@attribute SrcBytes numeric\n"
                         + "@attribute class {Background,Normal,Botnet}\n"
                         + "\n"
                         + "@data\n"
                         + "\n"
                         + "1065.731934,udp,' <->',...,0,0,2,252,145,Background\n"
                         + "1471.787109,udp,' <->',CON,0,0,2,252,145,Background";
    reader = new StringReader(inputString);
    int size = 0;
    int classAttribute = 10;
    loader = new ArffLoader(reader, size, classAttribute);

  }

  @Test
  public void testGetHeader() {
    InstanceInformation header = loader.getStructure();
    assertEquals(10, header.numAttributes());
    assertEquals(9, header.classIndex());
    assertEquals(true, header.attribute(0).isNumeric());
    assertEquals(false, header.attribute(1).isNumeric());
    assertEquals(false, header.attribute(2).isNumeric());
    assertEquals(false, header.attribute(3).isNumeric());
    assertEquals(true, header.attribute(4).isNumeric());
    assertEquals(true, header.attribute(5).isNumeric());
    assertEquals(true, header.attribute(6).isNumeric());
    assertEquals(true, header.attribute(7).isNumeric());
    assertEquals(true, header.attribute(8).isNumeric());
    assertEquals(false, header.attribute(9).isNumeric());

    assertEquals(7, header.attribute(2).numValues());
    assertEquals(" <->", header.attribute(2).value(0));
    assertEquals(" <?>", header.attribute(2).value(1));
    assertEquals(" ->", header.attribute(2).value(2));
    assertEquals(" ?>", header.attribute(2).value(3));
    assertEquals(" who", header.attribute(2).value(4));
    assertEquals(" <-", header.attribute(2).value(5));
    assertEquals(" <?", header.attribute(2).value(6));

    assertEquals(3, header.attribute(9).numValues());
    assertEquals("Background", header.attribute(9).value(0));
    assertEquals("Normal", header.attribute(9).value(1));
    assertEquals("Botnet", header.attribute(9).value(2));

  }

  @Test
  public void testReadInstance() {
    Instance instance = loader.readInstance(reader);
    assertEquals(1065.731934, instance.value(0), 0);
    assertEquals(0, instance.value(1), 0);
    assertEquals(0, instance.value(2), 0);
    assertEquals(3, instance.value(3), 0);
    assertEquals(0, instance.value(4), 0);
    assertEquals(0, instance.value(5), 0);
    assertEquals(2, instance.value(6), 0);
    assertEquals(252, instance.value(7), 0);
    assertEquals(145, instance.value(8), 0);
    assertEquals(0, instance.value(9), 0);
  }
}