/*
 * Copyright (c) 2017 - present Facebook, Inc.
 * All rights reserved.
 *
 * This source code is licensed under the BSD style license found in the
 * LICENSE file in the root directory of this source tree. An additional grant
 * of patent rights can be found in the PATENTS file in the same directory.
 */
// makes it easier to mock graphql types
package com.facebook.graphql.model;

import java.util.List;

abstract class A {
  abstract A getA();
  abstract B getB();
  abstract C getC();
}

abstract class B {
  abstract C getC();
}

abstract class C {
  abstract D getD();
}

class D {}

abstract class GraphQLStory {

  public abstract List getActors();

}

class LithoTest {

  void /*basic chain*/onCreateLayout(A a) {
    a.getB().getC().getD();
  }

  void /*sibling chain*/onCreateLayout(A a, int i) {
    a.getB().getC().getD();
    a.getC().getD();
  }

  void /*split chain*/onCreateLayout(A a, int i1, int i2) {
    B b =  a.getB();
    C c = b.getC();
    c.getD();
  }


  void chainFromActual1(B b) {
    b.getC().getD();
  }

  void chainFromActual2(C c) {
    c.getD();
  }

  void /*chain rooted in actual*/onCreateLayout(A a, boolean b) {
    chainFromActual1(a.getB());
  }

  void /*local chain + interproc chain*/onCreateLayout(A a, char ch) {
    C c = a.getB().getC();
    chainFromActual2(c);
  }

  // conditional getters
  static GraphQLStory getPrimaryActor(GraphQLStory story) {
    List actors = story.getActors();
    return actors != null && actors.size() > 0 ? (GraphQLStory) actors.get(0) : null;
  }

  void /*conditional getters on formal*/onCreateLayout(GraphQLStory story) {
    getPrimaryActor(story).toString();
  }

  native static GraphQLStory getStory();

  void /*conditional getters on local*/onCreateLayout() {
    GraphQLStory story = getStory();
    getPrimaryActor(story).toString();
  }

  void /*cycle*/onCreateLayout(A a, float f) {
    a = a.getA();
  }

  void cycle(A a) {
    a = a.getA();
  }

  void /*interprocedural cycle*/onCreateLayout(A a, double d) {
    cycle(a);
  }

}