@Test
  public void testNitroSpecificFields() {
    Film film = createNitroFilm(false);
    ItemOnDemandHierarchy hierarchy = hierarchyFrom(film);
    String versionCrid = idGenerator.generateVersionCrid(hierarchy.item(), hierarchy.version());
    String onDemandImi =
        idGenerator.generateOnDemandImi(
            hierarchy.item(), hierarchy.version(), hierarchy.encoding(), hierarchy.location());

    ExtendedOnDemandProgramType onDemand =
        (ExtendedOnDemandProgramType) generator.generate(hierarchy, onDemandImi);

    assertEquals("http://nitro.bbc.co.uk/services/youview", onDemand.getServiceIDRef());
    assertEquals(versionCrid, onDemand.getProgram().getCrid());
    assertEquals(onDemandImi, onDemand.getInstanceMetadataId());

    InstanceDescriptionType instanceDesc = onDemand.getInstanceDescription();

    AVAttributesType avAttributes = instanceDesc.getAVAttributes();
    List<AudioAttributesType> audioAttributes = avAttributes.getAudioAttributes();
    AudioAttributesType audioAttribute = Iterables.getOnlyElement(audioAttributes);
    AudioLanguageType audioLanguage = audioAttribute.getAudioLanguage();

    assertEquals("urn:tva:metadata:cs:AudioPurposeCS:2007:1", audioLanguage.getPurpose());
    assertEquals(true, audioLanguage.isSupplemental());
    assertEquals("dubbed", audioLanguage.getType());
  }
  @Test
  public void testNonPublisherSpecificFields() {
    ItemOnDemandHierarchy onDemandHierarchy = hierarchyFrom(createNitroFilm(true));

    ExtendedOnDemandProgramType onDemand =
        (ExtendedOnDemandProgramType) generator.generate(onDemandHierarchy, ON_DEMAND_IMI);

    assertEquals("P0DT1H30M0.000S", onDemand.getPublishedDuration().toString());
    assertEquals("2012-07-03T00:00:00Z", onDemand.getStartOfAvailability().toString());
    assertEquals("2013-07-17T00:00:00Z", onDemand.getEndOfAvailability().toString());
    assertTrue(onDemand.getFree().isValue());

    InstanceDescriptionType instanceDesc = onDemand.getInstanceDescription();

    CaptionLanguageType captionLanguage =
        Iterables.getOnlyElement(instanceDesc.getCaptionLanguage());

    assertTrue(captionLanguage.isClosed());
    assertEquals(captionLanguage.getValue(), "en");

    List<SignLanguageType> signLanguages = instanceDesc.getSignLanguage();
    SignLanguageType signLanguageType = Iterables.getOnlyElement(signLanguages);
    assertEquals("bfi", signLanguageType.getValue());

    AVAttributesType avAttributes = instanceDesc.getAVAttributes();
    AudioAttributesType audioAttrs = Iterables.getOnlyElement(avAttributes.getAudioAttributes());

    assertEquals("urn:mpeg:mpeg7:cs:AudioPresentationCS:2001:3", audioAttrs.getMixType().getHref());

    VideoAttributesType videoAttrs = avAttributes.getVideoAttributes();

    assertEquals(Integer.valueOf(1280), videoAttrs.getHorizontalSize());
    assertEquals(Integer.valueOf(720), videoAttrs.getVerticalSize());
    assertEquals("16:9", Iterables.getOnlyElement(videoAttrs.getAspectRatio()).getValue());

    assertEquals(BigInteger.valueOf(VIDEO_BITRATE), avAttributes.getBitRate().getValue());
    assertTrue(avAttributes.getBitRate().isVariable());

    UniqueIDType otherId = Iterables.getOnlyElement(instanceDesc.getOtherIdentifier());
    assertEquals("b020tm1g", otherId.getValue());
    assertEquals("epid.bbc.co.uk", otherId.getAuthority());
  }