package com.airbnb.lottie;

import androidx.core.util.Pair;

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

import java.util.List;

import static junit.framework.TestCase.assertTrue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.IsEqual.equalTo;

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));
  }
}
