package com.airbnb.lottie;

import android.support.v4.util.Pair;

import org.junit.Before;
import org.junit.Test;

import java.util.List;

import static junit.framework.Assert.assertTrue;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertThat;

public class PerformanceTrackerTest {

  private PerformanceTracker performanceTracker;

  @Before
  public void setup() {
    performanceTracker = new PerformanceTracker();
    performanceTracker.setEnabled(true);
  }

  @Test
  public void testDisabled() {
    performanceTracker.setEnabled(false);
    performanceTracker.recordRenderTime("Hello", 16f);
    assertTrue(performanceTracker.getSortedRenderTimes().isEmpty());
  }

  @Test
  public void testOneFrame() {
    performanceTracker.recordRenderTime("Hello", 16f);
    List<Pair<String, Float>> sortedRenderTimes = performanceTracker.getSortedRenderTimes();
    assertThat(sortedRenderTimes.size(), equalTo(1));
    assertThat(sortedRenderTimes.get(0).first, equalTo("Hello"));
    assertThat(sortedRenderTimes.get(0).second, equalTo(16f));
  }

  @Test
  public void testTwoFrames() {
    performanceTracker.recordRenderTime("Hello", 16f);
    performanceTracker.recordRenderTime("Hello", 8f);
    List<Pair<String, Float>> sortedRenderTimes = performanceTracker.getSortedRenderTimes();
    assertThat(sortedRenderTimes.size(), equalTo(1));
    assertThat(sortedRenderTimes.get(0).first, equalTo("Hello"));
    assertThat(sortedRenderTimes.get(0).second, equalTo(12f));
  }

  @Test
  public void testTwoLayers() {
    performanceTracker.recordRenderTime("Hello", 16f);
    performanceTracker.recordRenderTime("World", 8f);
    List<Pair<String, Float>> sortedRenderTimes = performanceTracker.getSortedRenderTimes();
    assertThat(sortedRenderTimes.size(), equalTo(2));
    assertThat(sortedRenderTimes.get(0).first, equalTo("Hello"));
    assertThat(sortedRenderTimes.get(0).second, equalTo(16f));
    assertThat(sortedRenderTimes.get(1).first, equalTo("World"));
    assertThat(sortedRenderTimes.get(1).second, equalTo(8f));
  }

  @Test
  public void testTwoLayersAlternatingFrames() {
    performanceTracker.recordRenderTime("Hello", 16f);
    performanceTracker.recordRenderTime("World", 8f);
    performanceTracker.recordRenderTime("Hello", 32f);
    performanceTracker.recordRenderTime("World", 4f);
    List<Pair<String, Float>> sortedRenderTimes = performanceTracker.getSortedRenderTimes();
    assertThat(sortedRenderTimes.size(), equalTo(2));
    assertThat(sortedRenderTimes.get(0).first, equalTo("Hello"));
    assertThat(sortedRenderTimes.get(0).second, equalTo(24f));
    assertThat(sortedRenderTimes.get(1).first, equalTo("World"));
    assertThat(sortedRenderTimes.get(1).second, equalTo(6f));
  }
}
