/*
 * Copyright 2013-present Facebook, Inc.
 *
 * 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 com.facebook.buck.util.unit;

import static org.junit.Assert.assertEquals;

import org.junit.Test;

public class SizeUnitTest {

  @Test(expected = NumberFormatException.class)
  public void testInvalidParseBytes() {
    SizeUnit.parseBytes("foobar");
  }

  @Test
  public void testParseBytes() {
    assertEquals(Long.MAX_VALUE, SizeUnit.parseBytes(
        Long.toString(Long.MAX_VALUE) + "00 B"));
    assertEquals(0L, SizeUnit.parseBytes("0GB"));
    assertEquals(123L, SizeUnit.parseBytes("123 B"));
    assertEquals(123L, SizeUnit.parseBytes("123 Bytes"));

    assertEquals(1024L, SizeUnit.parseBytes("1 kb"));
    assertEquals(1536L, SizeUnit.parseBytes("1.5 kb"));
    assertEquals(1024L, SizeUnit.parseBytes("1 kilobytes"));

    assertEquals(10L * 1024L * 1024L, SizeUnit.parseBytes("10 mb"));
    assertEquals(2L * 1024L * 1024L, SizeUnit.parseBytes("2 megabytes"));

    assertEquals(10L * 1024L * 1024L * 1024L, SizeUnit.parseBytes("10 gb"));
    assertEquals(2L * 1024L * 1024L * 1024L, SizeUnit.parseBytes("2 gigabytes"));

    assertEquals(10L * 1024L * 1024L * 1024L * 1024L, SizeUnit.parseBytes("10 tb"));
    assertEquals(42L * 1024L * 1024L * 1024L * 1024L, SizeUnit.parseBytes("42 terabytes"));
  }

  @Test
  public void testBytes()  {
    assertEquals(4L, SizeUnit.BYTES.toBytes(4L));
    assertEquals(0L, SizeUnit.BYTES.toKilobytes(4L));
    assertEquals(2L, SizeUnit.BYTES.toKilobytes(2048L));
    assertEquals(10L, SizeUnit.BYTES.toMegabytes(10L * 1024L * 1024L));
    assertEquals(10L, SizeUnit.BYTES.toGigabytes(10L * 1024L * 1024L * 1024L));
    assertEquals(10L, SizeUnit.BYTES.toTerabytes(10L * 1024L * 1024L * 1024L * 1024L));
  }

  @Test
  public void testKilobytes() {
    assertEquals(2048L, SizeUnit.KILOBYTES.toBytes(2L));
    assertEquals(2048L, SizeUnit.KILOBYTES.toKilobytes(2048L));
    assertEquals(0L, SizeUnit.KILOBYTES.toMegabytes(4L));
    assertEquals(10L, SizeUnit.KILOBYTES.toMegabytes(10L * 1024L));
    assertEquals(10L, SizeUnit.KILOBYTES.toGigabytes(10L * 1024L * 1024L));
    assertEquals(10L, SizeUnit.KILOBYTES.toTerabytes(10L * 1024L * 1024L * 1024L));
  }

  @Test
  public void testMegabytes() {
    assertEquals(1024L * 1024L, SizeUnit.MEGABYTES.toBytes(1L));
    assertEquals(2048L, SizeUnit.MEGABYTES.toKilobytes(2L));
    assertEquals(42L, SizeUnit.MEGABYTES.toMegabytes(42L));
    assertEquals(0L, SizeUnit.MEGABYTES.toGigabytes(4L));
    assertEquals(10L, SizeUnit.MEGABYTES.toGigabytes(10L* 1024L));
    assertEquals(10L, SizeUnit.MEGABYTES.toTerabytes(10L * 1024L * 1024L));
  }

  @Test
  public void testGigabytes() {
    assertEquals(1024L * 1024L * 1024L, SizeUnit.GIGABYTES.toBytes(1L));
    assertEquals(2 * 1024L * 1024L, SizeUnit.GIGABYTES.toKilobytes(2L));
    assertEquals(2048L, SizeUnit.GIGABYTES.toMegabytes(2L));
    assertEquals(42L, SizeUnit.GIGABYTES.toGigabytes(42L));
    assertEquals(0L, SizeUnit.GIGABYTES.toTerabytes(4L));
    assertEquals(10L, SizeUnit.GIGABYTES.toTerabytes(10L * 1024L));
  }

  @Test
  public void testTerabytes() {
    assertEquals(1024L * 1024L * 1024L * 1024L, SizeUnit.TERABYTES.toBytes(1L));
    assertEquals(2 * 1024L * 1024L * 1024L, SizeUnit.TERABYTES.toKilobytes(2L));
    assertEquals(2L * 1024L * 1024L, SizeUnit.TERABYTES.toMegabytes(2L));
    assertEquals(2048L, SizeUnit.TERABYTES.toGigabytes(2L));
    assertEquals(42L, SizeUnit.TERABYTES.toTerabytes(42L));
  }
}
