@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());
  }
  @Test(groups = {"functional.encode"})
  public void testEncode() throws Exception {

    IMSIImpl imsi = new IMSIImpl("1111122222");
    ISDNAddressStringImpl mscNumber =
        new ISDNAddressStringImpl(AddressNature.international_number, NumberingPlan.ISDN, "22228");
    ISDNAddressStringImpl vlrNumber =
        new ISDNAddressStringImpl(AddressNature.international_number, NumberingPlan.ISDN, "22229");
    SupportedLCSCapabilitySets supportedLCSCapabilitySets =
        new SupportedLCSCapabilitySetsImpl(true, false, false, false, false);
    VLRCapability vlrCap =
        new VLRCapabilityImpl(
            null,
            null,
            false,
            null,
            null,
            false,
            supportedLCSCapabilitySets,
            null,
            null,
            false,
            false);
    UpdateLocationRequestImpl asc =
        new UpdateLocationRequestImpl(
            3, imsi, mscNumber, null, vlrNumber, null, null, vlrCap, false, false, null, null, null,
            false, false);
    // long mapProtocolVersion, IMSI imsi, ISDNAddressString mscNumber, ISDNAddressString
    // roamingNumber,
    // ISDNAddressString vlrNumber, LMSI lmsi, MAPExtensionContainer extensionContainer,
    // VlrCapability vlrCapability,
    // boolean informPreviousNetworkEntity,
    // boolean csLCSNotSupportedByUE, GSNAddress vGmlcAddress, ADDInfo addInfo, PagingArea
    // pagingArea, boolean
    // skipSubscriberDataUpdate,
    // boolean restorationIndicator

    AsnOutputStream asnOS = new AsnOutputStream();
    asc.encodeAll(asnOS);

    byte[] encodedData = asnOS.toByteArray();
    byte[] rawData = getEncodedData();
    assertTrue(Arrays.equals(rawData, encodedData));

    imsi = new IMSIImpl("1111122233");
    mscNumber =
        new ISDNAddressStringImpl(AddressNature.international_number, NumberingPlan.ISDN, "22228");
    vlrNumber =
        new ISDNAddressStringImpl(AddressNature.international_number, NumberingPlan.ISDN, "22229");
    supportedLCSCapabilitySets =
        new SupportedLCSCapabilitySetsImpl(true, false, false, false, false);
    vlrCap =
        new VLRCapabilityImpl(
            null,
            null,
            false,
            null,
            null,
            false,
            supportedLCSCapabilitySets,
            null,
            null,
            false,
            false);
    LMSIImpl lmsi = new LMSIImpl(getLmsiData());
    MAPExtensionContainer extensionContainer =
        MAPExtensionContainerTest.GetTestExtensionContainer();
    asc =
        new UpdateLocationRequestImpl(
            3,
            imsi,
            mscNumber,
            null,
            vlrNumber,
            lmsi,
            extensionContainer,
            vlrCap,
            true,
            true,
            null,
            null,
            null,
            true,
            true);

    asnOS = new AsnOutputStream();
    asc.encodeAll(asnOS);

    encodedData = asnOS.toByteArray();
    rawData = getEncodedData2();
    assertTrue(Arrays.equals(rawData, encodedData));

    GSNAddressImpl vGmlcAddress = new GSNAddressImpl(getGSNAddressData());
    IMEIImpl imeisv = new IMEIImpl("123456789009876");
    ADDInfoImpl addInfo = new ADDInfoImpl(imeisv, false);
    ArrayList<LocationArea> locationAreas = new ArrayList<LocationArea>();
    LACImpl lac = new LACImpl(123);
    LocationAreaImpl la = new LocationAreaImpl(lac);
    locationAreas.add(la);
    PagingAreaImpl pagingArea = new PagingAreaImpl(locationAreas);
    asc =
        new UpdateLocationRequestImpl(
            3,
            imsi,
            mscNumber,
            null,
            vlrNumber,
            lmsi,
            null,
            vlrCap,
            true,
            true,
            vGmlcAddress,
            addInfo,
            pagingArea,
            true,
            true);

    asnOS = new AsnOutputStream();
    asc.encodeAll(asnOS);

    encodedData = asnOS.toByteArray();
    rawData = getEncodedData3();
    assertTrue(Arrays.equals(rawData, encodedData));

    imsi = new IMSIImpl("1111122233");
    ISDNAddressStringImpl roamingNumberNumber =
        new ISDNAddressStringImpl(AddressNature.international_number, NumberingPlan.ISDN, "22220");
    vlrNumber =
        new ISDNAddressStringImpl(AddressNature.international_number, NumberingPlan.ISDN, "22221");
    asc =
        new UpdateLocationRequestImpl(
            1,
            imsi,
            null,
            roamingNumberNumber,
            vlrNumber,
            null,
            null,
            null,
            false,
            false,
            null,
            null,
            null,
            false,
            false);

    asnOS = new AsnOutputStream();
    asc.encodeAll(asnOS);

    encodedData = asnOS.toByteArray();
    rawData = getEncodedData_V1();
    assertTrue(Arrays.equals(rawData, encodedData));
  }