@org.junit.Test
  public void testParseMatch() {
    String matchJson =
        "{\"comp_level\": \"f\", \"match_number\": 1, \"videos\": [{\"type\": \"youtube\", \"key\": \"ci6LicTg5rk\"}], \"time_string\": \"3:36 PM\", \"set_number\": 1, \"key\": \"2014ctgro_f1m1\", \"time\": \"1394393760\", \"alliances\": {\"blue\": {\"score\": 113, \"teams\": [\"frc1991\", \"frc230\", \"frc1699\"]}, \"red\": {\"score\": 120, \"teams\": [\"frc236\", \"frc237\", \"frc2064\"]}}, \"event_key\": \"2014ctgro\"}";
    Match match = JSONManager.getGson().fromJson(matchJson, Match.class);

    try {
      assertEquals(match.getKey(), "2014ctgro_f1m1");
      assertEquals(match.getEventKey(), "2014ctgro");
      assertEquals(match.getMatchNumber(), 1);
      assertEquals(match.getSetNumber(), 1);
      assertEquals(match.getType(), MatchHelper.TYPE.FINAL);
      assertEquals(
          match.getAlliances(),
          JSONManager.getasJsonObject(
              "{\"blue\": {\"score\": 113, \"teams\": [\"frc1991\", \"frc230\", \"frc1699\"]}, \"red\": {\"score\": 120, \"teams\": [\"frc236\", \"frc237\", \"frc2064\"]}}"));
      assertEquals(match.getTimeString(), "3:36 PM");
      assertEquals(match.getTime(), new Date(1394393760));
      assertEquals(
          match.getVideos(),
          JSONManager.getasJsonArray("[{\"type\": \"youtube\", \"key\": \"ci6LicTg5rk\"}]"));
    } catch (BasicModel.FieldNotDefinedException e) {
      Log.e(Constants.LOG_TAG, "Unable to get match fields");
      e.printStackTrace();
    }
  }
  @org.junit.Test
  public void testParseTeam() {
    String teamJson =
        "{\n"
            + "  \"website\": \"http://www.uberbots.org\",\n"
            + "  \"name\": \"UTC Fire and Security & Avon High School\",\n"
            + "  \"locality\": \"Avon\",\n"
            + "  \"rookie_year\": 2003,\n"
            + "  \"region\": \"CT\",\n"
            + "  \"team_number\": 1124,\n"
            + "  \"location\": \"Avon, CT, USA\",\n"
            + "  \"key\": \"frc1124\",\n"
            + "  \"country_name\": \"USA\",\n"
            + "  \"nickname\": \"ÜberBots\"\n"
            + "}";
    Team team = JSONManager.getGson().fromJson(teamJson, Team.class);

    try {
      assertEquals(team.getWebsite(), "http://www.uberbots.org");
      assertEquals(team.getFullName(), "UTC Fire and Security & Avon High School");
      assertEquals(team.getLocation(), "Avon, CT, USA");
      assertEquals((int) team.getTeamNumber(), 1124);
      assertEquals(team.getKey(), "frc1124");
      assertEquals(team.getNickname(), "ÜberBots");
    } catch (BasicModel.FieldNotDefinedException e) {
      Log.e(Constants.LOG_TAG, "Unable to get team fields");
      e.printStackTrace();
    }
  }
  @org.junit.Test
  public void testParseMedia() {
    String mediaJson =
        "["
            + "  {"
            + "    \"type\": \"cdphotothread\","
            + "    \"details\": {"
            + "      \"image_partial\": \"fe3/fe38d320428adf4f51ac969efb3db32c_l.jpg\""
            + "    },"
            + "    \"foreign_key\": \"39894\""
            + "  },"
            + "  {"
            + "    \"type\": \"youtube\","
            + "    \"details\": {},"
            + "    \"foreign_key\": \"RpSgUrsghv4\""
            + "  }"
            + "]";

    ArrayList<Media> medias = new ArrayList<>();
    JsonArray mediaArray = JSONManager.getasJsonArray(mediaJson);
    for (JsonElement media : mediaArray) {
      medias.add(JSONManager.getGson().fromJson(media, Media.class));
    }

    assertEquals(medias.size(), mediaArray.size());
    assertEquals(medias.size(), 2);

    Media cd = medias.get(0);
    Media yt = medias.get(1);
    try {
      assertEquals(cd.getForeignKey(), "39894");
      assertEquals(cd.getMediaType(), Media.TYPE.CD_PHOTO_THREAD);
      assertEquals(
          cd.getDetails(),
          JSONManager.getasJsonObject(
              "{\"image_partial\": \"fe3/fe38d320428adf4f51ac969efb3db32c_l.jpg\"}"));

      assertEquals(yt.getMediaType(), Media.TYPE.YOUTUBE);
      assertEquals(yt.getForeignKey(), "RpSgUrsghv4");
      assertEquals(yt.getDetails(), new JsonObject());
    } catch (BasicModel.FieldNotDefinedException e) {
      Log.e(Constants.LOG_TAG, "Unable to get media fields");
      e.printStackTrace();
    }
  }
  @org.junit.Test
  public void testParseEvent() {
    String eventJson =
        "{\"key\": \"2014ctgro\", \"end_date\": \"2014-03-09\", \"name\": \"Groton District Event\", \"short_name\": \"Groton\", \"facebook_eid\": null, \"official\": true, \"location\": \"Groton, CT, USA\", \"event_code\": \"ctgro\", \"year\": 2014, \"event_type_string\": \"District\", \"start_date\": \"2014-03-08\", \"event_type\": 1}";
    Event event = JSONManager.getGson().fromJson(eventJson, Event.class);

    // now, assert that all the properties are there
    try {
      assertEquals(event.getKey(), "2014ctgro");
      assertEquals(event.getStartDate(), new Date(114, 2, 8));
      assertEquals(event.getEndDate(), new Date(114, 2, 9));
      assertEquals(event.getEventName(), "Groton District Event");
      assertEquals(event.getEventShortName(), "Groton");
      assertEquals(event.isOfficial(), true);
      assertEquals(event.getLocation(), "Groton, CT, USA");
      assertEquals(event.getEventType(), EventHelper.TYPE.DISTRICT);
    } catch (BasicModel.FieldNotDefinedException e) {
      Log.e(Constants.LOG_TAG, "Unable to get event fields");
      e.printStackTrace();
    }
  }
  @org.junit.Test
  public void testParseAwardNoAwardee() {
    String json =
        "{\n"
            + "    \"event_key\": \"2010sc\",\n"
            + "    \"name\": \"Winner\",\n"
            + "    \"recipient_list\": [\n"
            + "      {\n"
            + "        \"team_number\": 343,\n"
            + "        \"awardee\": null\n"
            + "      },\n"
            + "      {\n"
            + "        \"team_number\": 1261,\n"
            + "        \"awardee\": null\n"
            + "      },\n"
            + "      {\n"
            + "        \"team_number\": 1398,\n"
            + "        \"awardee\": null\n"
            + "      }\n"
            + "    ],\n"
            + "    \"year\": 2010\n"
            + "  }";
    Award award = JSONManager.getGson().fromJson(json, Award.class);

    try {
      assertEquals(award.getEventKey(), "2010sc");
      assertEquals(award.getName(), "Winner");
      assertEquals(award.getYear(), 2010);

      JsonArray recips = award.getWinners();
      String[] winners = {"343", "1261", "1398"};
      assertEquals(recips.size(), 3);
      for (int i = 0; i < 3; i++) {
        assertEquals(winners[i], recips.get(i).getAsJsonObject().get("team_number").getAsString());
      }
    } catch (BasicModel.FieldNotDefinedException e) {
      Log.e(Constants.LOG_TAG, "Unable to get award fields");
      e.printStackTrace();
    }
  }
  @org.junit.Test
  public void testParseAwardNoTeam() {
    String json =
        "{\n"
            + "    \"event_key\": \"2010sc\",\n"
            + "    \"name\": \"FIRST Dean's List Finalist Award\",\n"
            + "    \"recipient_list\": [\n"
            + "      {\n"
            + "        \"team_number\": null,\n"
            + "        \"awardee\": \"Brandon Dean\"\n"
            + "      },\n"
            + "      {\n"
            + "        \"team_number\": null,\n"
            + "        \"awardee\": \"Megan Shew\"\n"
            + "      }\n"
            + "    ],\n"
            + "    \"year\": 2010\n"
            + "  }";
    Award award = JSONManager.getGson().fromJson(json, Award.class);

    try {
      assertEquals(award.getEventKey(), "2010sc");
      assertEquals(award.getName(), "FIRST Dean's List Finalist Award");
      assertEquals(award.getYear(), 2010);

      JsonArray recips = award.getWinners();
      String[] winners = {"Brandon Dean", "Megan Shew"};
      assertEquals(recips.size(), 2);
      for (int i = 0; i < 2; i++) {
        assertEquals(winners[i], recips.get(i).getAsJsonObject().get("awardee").getAsString());
      }
    } catch (BasicModel.FieldNotDefinedException e) {
      Log.e(Constants.LOG_TAG, "Unable to get award fields");
      e.printStackTrace();
    }
  }