@Test(groups = {"functional.decode"})
  public void testDecode() throws Exception {

    byte[] rawData = getEncodedData();
    AsnInputStream asn = new AsnInputStream(rawData);

    int tag = asn.readTag();
    UpdateLocationRequestImpl asc = new UpdateLocationRequestImpl(3);
    asc.decodeAll(asn);

    assertEquals(tag, Tag.SEQUENCE);
    assertEquals(asn.getTagClass(), Tag.CLASS_UNIVERSAL);
    assertEquals(asc.getMapProtocolVersion(), 3);

    IMSI imsi = asc.getImsi();
    assertTrue(imsi.getData().equals("1111122222"));

    assertNull(asc.getRoamingNumber());
    ISDNAddressString mscNumber = asc.getMscNumber();
    assertTrue(mscNumber.getAddress().equals("22228"));
    assertEquals(mscNumber.getAddressNature(), AddressNature.international_number);
    assertEquals(mscNumber.getNumberingPlan(), NumberingPlan.ISDN);

    ISDNAddressString vlrNumber = asc.getVlrNumber();
    assertTrue(vlrNumber.getAddress().equals("22229"));
    assertEquals(vlrNumber.getAddressNature(), AddressNature.international_number);
    assertEquals(vlrNumber.getNumberingPlan(), NumberingPlan.ISDN);

    VLRCapability vlrCap = asc.getVlrCapability();
    assertTrue(vlrCap.getSupportedLCSCapabilitySets().getCapabilitySetRelease98_99());
    assertFalse(vlrCap.getSupportedLCSCapabilitySets().getCapabilitySetRelease4());

    assertNull(asc.getLmsi());
    assertNull(asc.getExtensionContainer());

    assertFalse(asc.getInformPreviousNetworkEntity());
    assertFalse(asc.getCsLCSNotSupportedByUE());
    assertFalse(asc.getSkipSubscriberDataUpdate());
    assertFalse(asc.getRestorationIndicator());

    rawData = getEncodedData2();
    asn = new AsnInputStream(rawData);

    tag = asn.readTag();
    asc = new UpdateLocationRequestImpl(3);
    asc.decodeAll(asn);

    assertEquals(tag, Tag.SEQUENCE);
    assertEquals(asn.getTagClass(), Tag.CLASS_UNIVERSAL);
    assertEquals(asc.getMapProtocolVersion(), 3);

    imsi = asc.getImsi();
    assertTrue(imsi.getData().equals("1111122233"));

    assertNull(asc.getRoamingNumber());
    mscNumber = asc.getMscNumber();
    assertTrue(mscNumber.getAddress().equals("22228"));
    assertEquals(mscNumber.getAddressNature(), AddressNature.international_number);
    assertEquals(mscNumber.getNumberingPlan(), NumberingPlan.ISDN);

    vlrNumber = asc.getVlrNumber();
    assertTrue(vlrNumber.getAddress().equals("22229"));
    assertEquals(vlrNumber.getAddressNature(), AddressNature.international_number);
    assertEquals(vlrNumber.getNumberingPlan(), NumberingPlan.ISDN);

    vlrCap = asc.getVlrCapability();
    assertTrue(vlrCap.getSupportedLCSCapabilitySets().getCapabilitySetRelease98_99());
    assertFalse(vlrCap.getSupportedLCSCapabilitySets().getCapabilitySetRelease4());

    assertTrue(Arrays.equals(asc.getLmsi().getData(), getLmsiData()));
    assertTrue(MAPExtensionContainerTest.CheckTestExtensionContainer(asc.getExtensionContainer()));

    assertTrue(asc.getInformPreviousNetworkEntity());
    assertTrue(asc.getCsLCSNotSupportedByUE());
    assertTrue(asc.getSkipSubscriberDataUpdate());
    assertTrue(asc.getRestorationIndicator());

    rawData = getEncodedData3();
    asn = new AsnInputStream(rawData);

    tag = asn.readTag();
    asc = new UpdateLocationRequestImpl(3);
    asc.decodeAll(asn);

    assertEquals(tag, Tag.SEQUENCE);
    assertEquals(asn.getTagClass(), Tag.CLASS_UNIVERSAL);
    assertEquals(asc.getMapProtocolVersion(), 3);

    imsi = asc.getImsi();
    assertTrue(imsi.getData().equals("1111122233"));

    assertNull(asc.getRoamingNumber());
    mscNumber = asc.getMscNumber();
    assertTrue(mscNumber.getAddress().equals("22228"));
    assertEquals(mscNumber.getAddressNature(), AddressNature.international_number);
    assertEquals(mscNumber.getNumberingPlan(), NumberingPlan.ISDN);

    vlrNumber = asc.getVlrNumber();
    assertTrue(vlrNumber.getAddress().equals("22229"));
    assertEquals(vlrNumber.getAddressNature(), AddressNature.international_number);
    assertEquals(vlrNumber.getNumberingPlan(), NumberingPlan.ISDN);

    vlrCap = asc.getVlrCapability();
    assertTrue(vlrCap.getSupportedLCSCapabilitySets().getCapabilitySetRelease98_99());
    assertFalse(vlrCap.getSupportedLCSCapabilitySets().getCapabilitySetRelease4());

    assertTrue(Arrays.equals(asc.getLmsi().getData(), getLmsiData()));
    assertNull(asc.getExtensionContainer());

    assertTrue(asc.getInformPreviousNetworkEntity());
    assertTrue(asc.getCsLCSNotSupportedByUE());
    assertTrue(asc.getSkipSubscriberDataUpdate());
    assertTrue(asc.getRestorationIndicator());

    assertTrue(Arrays.equals(asc.getVGmlcAddress().getData(), getGSNAddressData()));
    assertTrue(asc.getADDInfo().getImeisv().getIMEI().equals("123456789009876"));
    assertFalse(asc.getADDInfo().getSkipSubscriberDataUpdate());
    assertEquals(asc.getPagingArea().getLocationAreas().size(), 1);
    assertEquals(asc.getPagingArea().getLocationAreas().get(0).getLAC().getLac(), 123);

    rawData = getEncodedData_V1();
    asn = new AsnInputStream(rawData);

    tag = asn.readTag();
    asc = new UpdateLocationRequestImpl(1);
    asc.decodeAll(asn);

    assertEquals(tag, Tag.SEQUENCE);
    assertEquals(asn.getTagClass(), Tag.CLASS_UNIVERSAL);
    assertEquals(asc.getMapProtocolVersion(), 1);

    imsi = asc.getImsi();
    assertTrue(imsi.getData().equals("1111122233"));

    assertNull(asc.getMscNumber());
    ISDNAddressString roamingNumber = asc.getRoamingNumber();
    assertTrue(roamingNumber.getAddress().equals("22220"));
    assertEquals(roamingNumber.getAddressNature(), AddressNature.international_number);
    assertEquals(roamingNumber.getNumberingPlan(), NumberingPlan.ISDN);

    vlrNumber = asc.getVlrNumber();
    assertTrue(vlrNumber.getAddress().equals("22221"));
    assertEquals(vlrNumber.getAddressNature(), AddressNature.international_number);
    assertEquals(vlrNumber.getNumberingPlan(), NumberingPlan.ISDN);

    assertNull(asc.getVlrCapability());
    assertNull(asc.getLmsi());
    assertNull(asc.getExtensionContainer());
    assertFalse(asc.getInformPreviousNetworkEntity());
    assertFalse(asc.getCsLCSNotSupportedByUE());
    assertFalse(asc.getSkipSubscriberDataUpdate());
    assertFalse(asc.getRestorationIndicator());
  }