/**
 * Copyright (c) 2015-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.
 *
 * @flow
 */

'use strict';

const FlatList = require('FlatList');
const React = require('react');

function renderMyListItem(info: {item: {title: string}, index: number}) {
  return <span />;
}

module.exports = {
  testEverythingIsFine() {
    const data = [{
      title: 'Title Text',
      key: 1,
    }];
    return <FlatList renderItem={renderMyListItem} data={data} />;
  },

  testBadDataWithTypicalItem() {
    // $FlowExpectedError - bad title type 6, should be string
    const data = [{
      title: 6,
      key: 1,
    }];
    return <FlatList renderItem={renderMyListItem} data={data} />;
  },

  testMissingFieldWithTypicalItem() {
    const data = [{
      key: 1,
    }];
    // $FlowExpectedError - missing title
    return <FlatList renderItem={renderMyListItem} data={data} />;
  },

  testGoodDataWithBadCustomRenderItemFunction() {
    const data = [{
      widget: 6,
      key: 1,
    }];
    return (
      <FlatList
        renderItem={(info) =>
          // $FlowExpectedError - bad widgetCount type 6, should be Object
          <span>{info.item.widget.missingProp}</span>
        }
        data={data}
      />
    );
  },

  testBadRenderItemFunction() {
    const data = [{
      title: 'foo',
      key: 1,
    }];
    return [
      // $FlowExpectedError - title should be inside `item`
      <FlatList renderItem={(info: {title: string}) => <span /> } data={data} />,
      // $FlowExpectedError - bad index type string, should be number
      <FlatList renderItem={(info: {item: any, index: string}) => <span /> } data={data} />,
      // $FlowExpectedError - bad title type number, should be string
      <FlatList renderItem={(info: {item: {title: number}}) => <span /> } data={data} />,
      // EverythingIsFine
      <FlatList renderItem={(info: {item: {title: string}}) => <span /> } data={data} />,
    ];
  },

  testOtherBadProps() {
    return [
      // $FlowExpectedError - bad numColumns type "lots"
      <FlatList renderItem={renderMyListItem} data={[]} numColumns="lots" />,
      // $FlowExpectedError - bad windowSize type "big"
      <FlatList renderItem={renderMyListItem} data={[]} windowSize="big" />,
      // $FlowExpectedError - missing `data` prop
      <FlatList renderItem={renderMyListItem} />,
    ];
  },
};