package com.airbnb.lottie;

import com.airbnb.lottie.model.KeyPath;

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

import java.util.List;

import static junit.framework.Assert.assertEquals;

public class KeyPathTest extends BaseTest {
  private static final String[] V = {
      "Shape Layer 1",
      "Group 1",
      "Rectangle",
      "Stroke"
  };
  private static final String I = "INVALID";
  private static final String W = "*";
  private static final String G = "**";

  private LottieDrawable lottieDrawable;

  @Before
  public void setupDrawable() {
    lottieDrawable = new LottieDrawable();
    LottieComposition composition = LottieCompositionFactory.fromJsonStringSync(Fixtures.SQUARES, "squares").getValue();
    lottieDrawable.setComposition(composition);
  }

  //<editor-fold desc="Basic Tests">
  @Test public void testV() { assertSize(1, V[0]); }
  @Test public void testI() { assertSize(0, I); }

  @Test public void testII() { assertSize(0, I,    I); }
  @Test public void testIV() { assertSize(0, I,    V[1]); }
  @Test public void testVI() { assertSize(0, V[0], I); }
  @Test public void testVV() { assertSize(1, V[0], V[1]); }

  @Test public void testIII() { assertSize(0, I,    I,    I); }
  @Test public void testIIV() { assertSize(0, I,    I,    V[3]); }
  @Test public void testIVI() { assertSize(0, I,    V[2], I); }
  @Test public void testIVV() { assertSize(0, I,    V[2], V[3]); }
  @Test public void testVII() { assertSize(0, V[0], I,    I); }
  @Test public void testVIV() { assertSize(0, V[0], I,    V[2]); }
  @Test public void testVVI() { assertSize(0, V[0], V[1], I); }
  @Test public void testVVV() { assertSize(1, V[0], V[1], V[2]); }

  @Test public void testIIII() { assertSize(0, I,    I,    I,    I); }
  @Test public void testIIIV() { assertSize(0, I,    I,    I,    V[3]); }
  @Test public void testIIVI() { assertSize(0, I,    I,    V[2], I); }
  @Test public void testIIVV() { assertSize(0, I,    I,    V[2], V[3]); }
  @Test public void testIVII() { assertSize(0, I,    V[1], I,    I); }
  @Test public void testIVIV() { assertSize(0, I,    V[1], I,    V[3]); }
  @Test public void testIVVI() { assertSize(0, I,    V[1], V[2], V[3]); }
  @Test public void testIVVV() { assertSize(0, I,    V[1], V[2], V[3]); }
  @Test public void testVIII() { assertSize(0, V[0], I,    I,    I); }
  @Test public void testVIIV() { assertSize(0, V[0], I,    I,    V[3]); }
  @Test public void testVIVI() { assertSize(0, V[0], I,    V[2], I); }
  @Test public void testVIVV() { assertSize(0, V[0], I,    V[2], V[3]); }
  @Test public void testVVII() { assertSize(0, V[0], V[1], I,    I); }
  @Test public void testVVIV() { assertSize(0, V[0], V[1], I,    V[3]); }
  @Test public void testVVVI() { assertSize(0, V[0], V[1], V[2], I); }
  @Test public void testVVVV() { assertSize(1, V[0], V[1], V[2], V[3]); }
  //</editor-fold>

  //<editor-fold desc="One Wildcard">
  @Test public void testWVVV() { assertSize(2, W,    V[1], V[2], V[3]); }
  @Test public void testVWVV() { assertSize(2, V[0], W,    V[2], V[3]); }
  @Test public void testVVWV() { assertSize(1, V[0], V[1], W,    V[3]); }
  @Test public void testVVVW() { assertSize(2, V[0], V[1], V[2], W); }
  //</editor-fold>

  //<editor-fold desc="Two Wildcards">
  @Test public void testWWVV() { assertSize(4, W, W,    V[2], V[3]); }
  @Test public void testWVWV() { assertSize(2, W, V[1], W,    V[3]); }
  @Test public void testWVVW() { assertSize(4, W, V[1], V[2], W); }
  @Test public void testWWIV() { assertSize(0, W, W,    I,    V[3]); }
  @Test public void testWWVI() { assertSize(0, W, W,    V[2], I); }
  @Test public void testWVW() { assertSize(2, W,  V[1], W); }
  //</editor-fold>

  //<editor-fold desc="Three Wildcards">
  @Test public void testWWW() { assertSize(4, W, W, W); }
  @Test public void testWWWV() { assertSize(4, W, W, W, V[3]); }
  @Test public void testWWWI() { assertSize(0, W, W, W, I); }
  //</editor-fold>

  //<editor-fold desc="Four Wildcards">
  @Test public void testWWWW() { assertSize(8, W, W, W, W); }
  //</editor-fold>

  //<editor-fold desc="One Globstar">
  @Test public void testG() { assertSize(18, G); }
  @Test public void testGI() { assertSize(0, G, I); }
  @Test public void testGV0() { assertSize(1, G, V[0]); }
  @Test public void testGV0V0() { assertSize(0, G, V[0], V[0]); }
  @Test public void testGV1() { assertSize(2, G, V[1]); }
  @Test public void testGV2() { assertSize(4, G, V[2]); }
  @Test public void testGV3() { assertSize(4, G, V[3]); }
  //</editor-fold>

  //<editor-fold desc="Two Globstars">
  @Test public void testGV0G() { assertSize(9, G, V[0], G); }
  @Test public void testGV1G() { assertSize(8, G, V[1], G); }
  @Test public void testGV2G() { assertSize(12, G, V[2], G); }
  @Test public void testGIG() {  assertSize(0, G, I,    G); }
  //</editor-fold>

  //<editor-fold desc="Wildcard and Globstar">
  @Test public void testWG() {   assertSize(18, W, G); }
  @Test public void testGV0W() { assertSize(2,  G, V[0], W); }
  @Test public void testWV0I() { assertSize(0,  W, V[0], I); }
  @Test public void testGV1W() { assertSize(2,  G, V[1], W); }
  @Test public void testWV1I() { assertSize(0,  W, V[1], I); }
  @Test public void testGV2W() { assertSize(8,  G, V[2], W); }
  @Test public void testWV2I() { assertSize(0,  W, V[2], I); }
  //</editor-fold>

  private void assertSize(int size, String... keys) {
    KeyPath keyPath = new KeyPath(keys);
    List<KeyPath> resolvedKeyPaths = lottieDrawable.resolveKeyPath(keyPath);
    assertEquals(size, resolvedKeyPaths.size());
  }
}
