/** Test the compatibility of the Playstation 3 with the MPG format. */
  @Test
  public void testPlaystationVideoMpgCompatibility() {
    // This test is only useful if the MediaInfo library is available
    assumeTrue(mediaInfoParserIsValid);

    RendererConfiguration conf =
        RendererConfiguration.getRendererConfigurationByName("Playstation 3");
    assertNotNull("No renderer named \"Playstation 3\" found.", conf);

    // Construct regular two channel MPG information
    DLNAMediaInfo info = new DLNAMediaInfo();
    info.setContainer("avi");
    DLNAMediaAudio audio = new DLNAMediaAudio();
    audio.setCodecA("ac3");
    audio.setNrAudioChannels(5);
    ArrayList<DLNAMediaAudio> audioCodes = new ArrayList<DLNAMediaAudio>();
    audioCodes.add(audio);
    info.setAudioCodes(audioCodes);
    info.setCodecV("mp4");
    Format format = new MPG();
    format.match("test.avi");
    assertEquals(
        "PS3 is reported to be incompatible with MPG", true, conf.isCompatible(info, format));

    // Construct MPG with wmv codec that the PS3 does not support natively
    info.setCodecV("wmv");
    assertEquals(
        "PS3 is reported to be compatible with MPG with wmv codec",
        false,
        conf.isCompatible(info, format));
  }
  /** Test the compatibility of the Playstation 3 with the MP3 format. */
  @Test
  public void testPlaystationAudioMp3Compatibility() {
    // This test is only useful if the MediaInfo library is available
    assumeTrue(mediaInfoParserIsValid);

    RendererConfiguration conf =
        RendererConfiguration.getRendererConfigurationByName("Playstation 3");
    assertNotNull("No renderer named \"Playstation 3\" found.", conf);

    // Construct regular two channel MP3 information
    DLNAMediaInfo info = new DLNAMediaInfo();
    info.setContainer("mp3");
    info.setMimeType(HTTPResource.AUDIO_MP3_TYPEMIME);
    DLNAMediaAudio audio = new DLNAMediaAudio();
    audio.setNrAudioChannels(2);
    ArrayList<DLNAMediaAudio> audioCodes = new ArrayList<DLNAMediaAudio>();
    audioCodes.add(audio);
    info.setAudioCodes(audioCodes);
    Format format = new MP3();
    format.match("test.mp3");
    assertEquals(
        "PS3 is reported to be incompatible with MP3", true, conf.isCompatible(info, format));

    // Construct five channel MP3 that the PS3 does not support natively
    audio.setNrAudioChannels(5);
    assertEquals(
        "PS3 is reported to be incompatible with MP3", false, conf.isCompatible(info, format));
  }
  /** Test the compatibility of the Playstation 3 with the GIF format. */
  @Test
  public void testPlaystationImageGifCompatibility() {
    // This test is only useful if the MediaInfo library is available
    assumeTrue(mediaInfoParserIsValid);

    RendererConfiguration conf =
        RendererConfiguration.getRendererConfigurationByName("Playstation 3");
    assertNotNull("No renderer named \"Playstation 3\" found.", conf);

    // Construct GIF information
    DLNAMediaInfo info = new DLNAMediaInfo();
    info.setContainer("gif");
    Format format = new GIF();
    format.match("test.gif");
    assertEquals(
        "PS3 is reported to be incompatible with GIF", true, conf.isCompatible(info, format));
  }
  /** {@inheritDoc} */
  @Override
  public boolean isCompatible(DLNAResource resource) {
    if (resource == null || resource.getFormat().getType() != Format.VIDEO) {
      return false;
    }

    Format format = resource.getFormat();

    if (format != null) {
      Format.Identifier id = format.getIdentifier();

      if (id.equals(Format.Identifier.WEB)) {
        return true;
      }
    }

    return false;
  }
  /**
   * Returns the player that matches the given class and format.
   *
   * @param profileClass The class to match.
   * @param ext The format to match.
   * @return The player if a match could be found, <code>null</code> otherwise.
   */
  public static Player getPlayer(final Class<? extends Player> profileClass, final Format ext) {

    for (Player player : players) {
      if (player.getClass().equals(profileClass)
          && player.type() == ext.getType()
          && !player.excludeFormat(ext)) {
        return player;
      }
    }

    return null;
  }
  /**
   * Test the backwards compatibility of {@link Format#isCompatible(DLNAMediaInfo,
   * RendererConfiguration)} and {@link Format#ps3compatible()}.
   */
  @SuppressWarnings("deprecation")
  @Test
  public void testBackwardsCompatibility() {
    // This test is only useful if the MediaInfo library is available
    assumeTrue(mediaInfoParserIsValid);

    // Testing ps3compatible(), so use renderer Playstation 3
    RendererConfiguration conf =
        RendererConfiguration.getRendererConfigurationByName("Playstation 3");
    assertNotNull("No renderer named \"Playstation 3\" found.", conf);

    // DVRMS: false
    DLNAMediaInfo info = new DLNAMediaInfo();
    info.setContainer("dvr");
    Format format = new DVRMS();
    format.match("test.dvr");
    assertEquals(
        "isCompatible() reporting different outcome than ps3compatible() for DVRMS",
        format.ps3compatible(),
        conf.isCompatible(info, format));

    // ISO: false
    info = new DLNAMediaInfo();
    info.setContainer("iso");
    format = new ISO();
    format.match("test.iso");
    assertEquals(
        "isCompatible() reporting different outcome than ps3compatible() for ISO",
        format.ps3compatible(),
        conf.isCompatible(info, format));

    // JPG: true
    info = new DLNAMediaInfo();
    info.setContainer("jpg");
    format = new JPG();
    format.match("test.jpeg");
    assertEquals(
        "isCompatible() reporting different outcome than ps3compatible() for JPG",
        format.ps3compatible(),
        conf.isCompatible(info, format));

    // M4A: false
    info = new DLNAMediaInfo();
    info.setContainer("m4a");
    format = new M4A();
    format.match("test.m4a");
    assertEquals(
        "isCompatible() reporting different outcome than ps3compatible() for M4A",
        format.ps3compatible(),
        conf.isCompatible(info, format));

    // MKV: false
    info = new DLNAMediaInfo();
    info.setContainer("mkv");
    format = new MKV();
    format.match("test.mkv");
    assertEquals(
        "isCompatible() reporting different outcome than ps3compatible() for MKV",
        format.ps3compatible(),
        conf.isCompatible(info, format));

    // MP3: true
    info = new DLNAMediaInfo();
    info.setContainer("mp3");
    format = new MP3();
    format.match("test.mp3");
    assertEquals(
        "isCompatible() reporting different outcome than ps3compatible() for MP3",
        format.ps3compatible(),
        conf.isCompatible(info, format));

    // MPG: true
    info = new DLNAMediaInfo();
    info.setContainer("avi");
    format = new MPG();
    format.match("test.mpg");
    assertEquals(
        "isCompatible() reporting different outcome than ps3compatible() for MPG",
        format.ps3compatible(),
        conf.isCompatible(info, format));

    // OGG: false
    info = new DLNAMediaInfo();
    info.setContainer("ogg");
    format = new OGG();
    format.match("test.ogg");
    assertEquals(
        "isCompatible() reporting different outcome than ps3compatible() for OGG",
        format.ps3compatible(),
        conf.isCompatible(info, format));

    // RAW: false
    info = new DLNAMediaInfo();
    info.setContainer("raw");
    format = new RAW();
    format.match("test.arw");
    assertEquals(
        "isCompatible() reporting different outcome than ps3compatible() for RAW",
        format.ps3compatible(),
        conf.isCompatible(info, format));

    // WAV: true
    info = new DLNAMediaInfo();
    info.setContainer("wav");
    format = new WAV();
    format.match("test.wav");
    assertEquals(
        "isCompatible() reporting different outcome than ps3compatible() for WAV",
        format.ps3compatible(),
        conf.isCompatible(info, format));

    // WEB: type=IMAGE
    info = new DLNAMediaInfo();
    info.setContainer("jpg");
    format = new WEB();
    format.match("http://test.org/");
    format.setType(Format.IMAGE);
    assertEquals(
        "isCompatible() reporting different outcome than ps3compatible() for WEB image",
        format.ps3compatible(),
        conf.isCompatible(info, format));

    // WEB: type=VIDEO
    info = new DLNAMediaInfo();
    info.setContainer("avi");
    format.setType(Format.VIDEO);
    assertEquals(
        "isCompatible() reporting different outcome than ps3compatible() for WEB video",
        format.ps3compatible(),
        conf.isCompatible(info, format));
  }