From cba7ad2b4cdb66e68e32acd72c9db643f95003b0 Mon Sep 17 00:00:00 2001 From: Chad Huff Date: Thu, 14 Nov 2024 10:09:00 -0700 Subject: [PATCH 1/3] DE IA NE NH NJ TN --- README.md | 90 +++++ modules/cmpapi/.mocharc.json | 6 + modules/cmpapi/README.md | 317 ++++++++++++----- modules/cmpapi/src/encoder/GppModel.ts | 60 ++++ modules/cmpapi/src/encoder/field/UsDeField.ts | 35 ++ modules/cmpapi/src/encoder/field/UsIaField.ts | 35 ++ modules/cmpapi/src/encoder/field/UsNeField.ts | 35 ++ modules/cmpapi/src/encoder/field/UsNhField.ts | 35 ++ modules/cmpapi/src/encoder/field/UsNjField.ts | 35 ++ modules/cmpapi/src/encoder/field/UsTnField.ts | 35 ++ modules/cmpapi/src/encoder/field/index.ts | 6 + .../cmpapi/src/encoder/section/Sections.ts | 18 + modules/cmpapi/src/encoder/section/UsDe.ts | 77 +++++ modules/cmpapi/src/encoder/section/UsIa.ts | 77 +++++ modules/cmpapi/src/encoder/section/UsNe.ts | 77 +++++ modules/cmpapi/src/encoder/section/UsNh.ts | 77 +++++ modules/cmpapi/src/encoder/section/UsNj.ts | 77 +++++ modules/cmpapi/src/encoder/section/UsTn.ts | 77 +++++ modules/cmpapi/src/encoder/section/index.ts | 7 +- .../src/encoder/segment/UsDeCoreSegment.ts | 232 +++++++++++++ .../src/encoder/segment/UsDeGpcSegment.ts | 56 +++ .../src/encoder/segment/UsIaCoreSegment.ts | 232 +++++++++++++ .../src/encoder/segment/UsIaGpcSegment.ts | 56 +++ .../src/encoder/segment/UsNatCoreSegment.ts | 4 +- .../src/encoder/segment/UsNeCoreSegment.ts | 232 +++++++++++++ .../src/encoder/segment/UsNeGpcSegment.ts | 56 +++ .../src/encoder/segment/UsNhCoreSegment.ts | 232 +++++++++++++ .../src/encoder/segment/UsNhGpcSegment.ts | 56 +++ .../src/encoder/segment/UsNjCoreSegment.ts | 232 +++++++++++++ .../src/encoder/segment/UsNjGpcSegment.ts | 56 +++ .../src/encoder/segment/UsTnCoreSegment.ts | 232 +++++++++++++ .../src/encoder/segment/UsTnGpcSegment.ts | 56 +++ modules/cmpapi/src/encoder/segment/index.ts | 14 +- modules/cmpapi/test/GppModel.test.ts | 32 +- .../cmpapi/test/encoder/section/UsDe.test.ts | 320 ++++++++++++++++++ .../cmpapi/test/encoder/section/UsIa.test.ts | 320 ++++++++++++++++++ .../cmpapi/test/encoder/section/UsNat.test.ts | 48 +-- .../cmpapi/test/encoder/section/UsNe.test.ts | 320 ++++++++++++++++++ .../cmpapi/test/encoder/section/UsNh.test.ts | 320 ++++++++++++++++++ .../cmpapi/test/encoder/section/UsNj.test.ts | 320 ++++++++++++++++++ .../cmpapi/test/encoder/section/UsTn.test.ts | 320 ++++++++++++++++++ 41 files changed, 4807 insertions(+), 115 deletions(-) create mode 100644 modules/cmpapi/src/encoder/field/UsDeField.ts create mode 100644 modules/cmpapi/src/encoder/field/UsIaField.ts create mode 100644 modules/cmpapi/src/encoder/field/UsNeField.ts create mode 100644 modules/cmpapi/src/encoder/field/UsNhField.ts create mode 100644 modules/cmpapi/src/encoder/field/UsNjField.ts create mode 100644 modules/cmpapi/src/encoder/field/UsTnField.ts create mode 100644 modules/cmpapi/src/encoder/section/UsDe.ts create mode 100644 modules/cmpapi/src/encoder/section/UsIa.ts create mode 100644 modules/cmpapi/src/encoder/section/UsNe.ts create mode 100644 modules/cmpapi/src/encoder/section/UsNh.ts create mode 100644 modules/cmpapi/src/encoder/section/UsNj.ts create mode 100644 modules/cmpapi/src/encoder/section/UsTn.ts create mode 100644 modules/cmpapi/src/encoder/segment/UsDeCoreSegment.ts create mode 100644 modules/cmpapi/src/encoder/segment/UsDeGpcSegment.ts create mode 100644 modules/cmpapi/src/encoder/segment/UsIaCoreSegment.ts create mode 100644 modules/cmpapi/src/encoder/segment/UsIaGpcSegment.ts create mode 100644 modules/cmpapi/src/encoder/segment/UsNeCoreSegment.ts create mode 100644 modules/cmpapi/src/encoder/segment/UsNeGpcSegment.ts create mode 100644 modules/cmpapi/src/encoder/segment/UsNhCoreSegment.ts create mode 100644 modules/cmpapi/src/encoder/segment/UsNhGpcSegment.ts create mode 100644 modules/cmpapi/src/encoder/segment/UsNjCoreSegment.ts create mode 100644 modules/cmpapi/src/encoder/segment/UsNjGpcSegment.ts create mode 100644 modules/cmpapi/src/encoder/segment/UsTnCoreSegment.ts create mode 100644 modules/cmpapi/src/encoder/segment/UsTnGpcSegment.ts create mode 100644 modules/cmpapi/test/encoder/section/UsDe.test.ts create mode 100644 modules/cmpapi/test/encoder/section/UsIa.test.ts create mode 100644 modules/cmpapi/test/encoder/section/UsNe.test.ts create mode 100644 modules/cmpapi/test/encoder/section/UsNh.test.ts create mode 100644 modules/cmpapi/test/encoder/section/UsNj.test.ts create mode 100644 modules/cmpapi/test/encoder/section/UsTn.test.ts diff --git a/README.md b/README.md index 891f633..aeb41c5 100644 --- a/README.md +++ b/README.md @@ -288,6 +288,96 @@ __gpp("removeEventListener", callback?, parameter?) | ustx | 16 | GpcSegmentType | 2 bit int. Value is 1 | | ustx | 16 | GpcSegmentIncluded | Boolean. Default is true | | ustx | 16 | Gpc | Boolean | +| usde | 17 | Version | 6 bit int. Value is 1 | +| usde | 17 | ProcessingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | SensitiveDataProcessing | 2 bit int array of size 9. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | KnownChildSensitiveDataConsents | 2 bit int array of size 5. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | AdditionalDataProcessingConsent | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | GpcSegmentType | 2 bit int. Value is 1 | +| usde | 17 | GpcSegmentIncluded | Boolean. Default is true | +| usde | 17 | Gpc | Boolean | +| usia | 18 | Version | 6 bit int. Value is 1 | +| usia | 18 | ProcessingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | SensitiveDataOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | SensitiveDataProcessing | 2 bit int array of size 8. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | KnownChildSensitiveDataConsents | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | GpcSegmentType | 2 bit int. Value is 1 | +| usia | 18 | GpcSegmentIncluded | Boolean. Default is true | +| usia | 18 | Gpc | Boolean | +| usne | 19 | Version | 6 bit int. Value is 1 | +| usne | 19 | ProcessingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | SensitiveDataProcessing | 2 bit int array of size 8. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | KnownChildSensitiveDataConsents | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | AdditionalDataProcessingConsent | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | GpcSegmentType | 2 bit int. Value is 1 | +| usne | 19 | GpcSegmentIncluded | Boolean. Default is true | +| usne | 19 | Gpc | Boolean | +| usnh | 20 | Version | 6 bit int. Value is 1 | +| usnh | 20 | ProcessingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | SensitiveDataProcessing | 2 bit int array of size 8. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | KnownChildSensitiveDataConsents | 2 bit int array of size 3. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | AdditionalDataProcessingConsent | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | GpcSegmentType | 2 bit int. Value is 1 | +| usnh | 20 | GpcSegmentIncluded | Boolean. Default is true | +| usnh | 20 | Gpc | Boolean | +| usnj | 21 | Version | 6 bit int. Value is 1 | +| usnj | 21 | ProcessingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | SensitiveDataProcessing | 2 bit int array of size 10. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | KnownChildSensitiveDataConsents | 2 bit int array of size 5. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | AdditionalDataProcessingConsent | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | GpcSegmentType | 2 bit int. Value is 1 | +| usnj | 21 | GpcSegmentIncluded | Boolean. Default is true | +| usnj | 21 | Gpc | Boolean | +| ustn | 22 | Version | 6 bit int. Value is 1 | +| ustn | 22 | ProcessingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | SensitiveDataProcessing | 2 bit int array of size 8. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | KnownChildSensitiveDataConsents | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | AdditionalDataProcessingConsent | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | GpcSegmentType | 2 bit int. Value is 1 | +| ustn | 22 | GpcSegmentIncluded | Boolean. Default is true | +| ustn | 22 | Gpc | Boolean | ## Example Usage / Encoder / Decoder diff --git a/modules/cmpapi/.mocharc.json b/modules/cmpapi/.mocharc.json index 22c6bc6..4e54a9a 100644 --- a/modules/cmpapi/.mocharc.json +++ b/modules/cmpapi/.mocharc.json @@ -30,10 +30,16 @@ "./test/encoder/section/UsCa.test.ts", "./test/encoder/section/UsCo.test.ts", "./test/encoder/section/UsCt.test.ts", + "./test/encoder/section/UsDe.test.ts", "./test/encoder/section/UsFl.test.ts", + "./test/encoder/section/UsIa.test.ts", "./test/encoder/section/UsMt.test.ts", "./test/encoder/section/UsNat.test.ts", + "./test/encoder/section/UsNe.test.ts", + "./test/encoder/section/UsNh.test.ts", + "./test/encoder/section/UsNj.test.ts", "./test/encoder/section/UsOr.test.ts", + "./test/encoder/section/UsTn.test.ts", "./test/encoder/section/UsTx.test.ts", "./test/encoder/section/UsUt.test.ts", "./test/encoder/section/UsVa.test.ts", diff --git a/modules/cmpapi/README.md b/modules/cmpapi/README.md index c091768..aeb41c5 100644 --- a/modules/cmpapi/README.md +++ b/modules/cmpapi/README.md @@ -146,91 +146,238 @@ __gpp("removeEventListener", callback?, parameter?) | uspv1 | 6 | Notice | 2 bit int | | uspv1 | 6 | OptOutSale | 2 bit int | | uspv1 | 6 | LspaCovered | 2 bit int | -| usnat | 7 | Version | 6 bit int. Value is 1 | -| usnat | 7 | SharingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usnat | 7 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usnat | 7 | SharingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usnat | 7 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usnat | 7 | SensitiveDataProcessingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usnat | 7 | SensitiveDataLimitUseNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usnat | 7 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usnat | 7 | SharingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usnat | 7 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usnat | 7 | SensitiveDataProcessing | 2 bit int array of size 12. 0=Not applicable, 1=Yes, 2=No | -| usnat | 7 | KnownChildSensitiveDataConsents | 2 bit int array of size 2. 0=Not applicable, 1=Yes, 2=No | -| usnat | 7 | PersonalDataConsents | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usnat | 7 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usnat | 7 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usnat | 7 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usnat | 7 | GpcSegmentType | 2 bit int. Value is 1 | -| usnat | 7 | GpcSegmentIncluded | Boolean. Default is true | -| usnat | 7 | Gpc | Boolean | -| usca | 8 | Version | 6 bit int. Value is 1 | -| usca | 8 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usca | 8 | SharingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usca | 8 | SensitiveDataLimitUseNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usca | 8 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usca | 8 | SharingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usca | 8 | SensitiveDataProcessing | 2 bit int array of size 9. 0=Not applicable, 1=Yes, 2=No | -| usca | 8 | KnownChildSensitiveDataConsents | 2 bit int array of size 2. 0=Not applicable, 1=Yes, 2=No | -| usca | 8 | PersonalDataConsents | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usca | 8 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usca | 8 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usca | 8 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usca | 8 | GpcSegmentType | 2 bit int. Value is 1 | -| usca | 8 | GpcSegmentIncluded | Boolean. Default is true | -| usca | 8 | Gpc | Boolean | -| usva | 9 | Version | 6 bit int. Value is 1 | -| usva | 9 | SharingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usva | 9 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usva | 9 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usva | 9 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usva | 9 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usva | 9 | SensitiveDataProcessing | 2 bit int array of size 8. 0=Not applicable, 1=Yes, 2=No | -| usva | 9 | KnownChildSensitiveDataConsents | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usva | 9 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usva | 9 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usva | 9 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usco | 10 | Version | 6 bit int. Value is 1 | -| usco | 10 | SharingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usco | 10 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usco | 10 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usco | 10 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usco | 10 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usco | 10 | SensitiveDataProcessing | 2 bit int array of size 7. 0=Not applicable, 1=Yes, 2=No | -| usco | 10 | KnownChildSensitiveDataConsents | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usco | 10 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usco | 10 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usco | 10 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usco | 10 | GpcSegmentType | 2 bit int. Value is 1 | -| usco | 10 | GpcSegmentIncluded | Boolean. Deafult is true | -| usco | 10 | Gpc | Boolean | -| usut | 11 | Version | 6 bit int. Value is 1 | -| usut | 11 | SharingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usut | 11 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usut | 11 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usut | 11 | SensitiveDataProcessingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usut | 11 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usut | 11 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usut | 11 | SensitiveDataProcessing | 2 bit int array of size 8. 0=Not applicable, 1=Yes, 2=No | -| usut | 11 | KnownChildSensitiveDataConsents | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usut | 11 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usut | 11 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usut | 11 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usct | 12 | Version | 6 bit int. Value is 1 | -| usct | 12 | SharingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usct | 12 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usct | 12 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usct | 12 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usct | 12 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usct | 12 | SensitiveDataProcessing | 2 bit int array of size 8. 0=Not applicable, 1=Yes, 2=No | -| usct | 12 | KnownChildSensitiveDataConsents | 2 bit int array of size 3. 0=Not applicable, 1=Yes, 2=No | -| usct | 12 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usct | 12 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usct | 12 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usct | 12 | GpcSegmentType | 2 bit int. Value is 1 | -| usct | 12 | GpcSegmentIncluded | Boolean. Default is true | -| usct | 12 | Gpc | Boolean | +| usnat | 7 | Version | 6 bit int. Value is 1 | +| usnat | 7 | SharingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnat | 7 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnat | 7 | SharingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnat | 7 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnat | 7 | SensitiveDataProcessingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnat | 7 | SensitiveDataLimitUseNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnat | 7 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnat | 7 | SharingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnat | 7 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnat | 7 | SensitiveDataProcessing | 2 bit int array of size 12. 0=Not applicable, 1=Yes, 2=No | +| usnat | 7 | KnownChildSensitiveDataConsents | 2 bit int array of size 2. 0=Not applicable, 1=Yes, 2=No | +| usnat | 7 | PersonalDataConsents | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnat | 7 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnat | 7 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnat | 7 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnat | 7 | GpcSegmentType | 2 bit int. Value is 1 | +| usnat | 7 | GpcSegmentIncluded | Boolean. Default is true | +| usnat | 7 | Gpc | Boolean | +| usca | 8 | Version | 6 bit int. Value is 1 | +| usca | 8 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usca | 8 | SharingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usca | 8 | SensitiveDataLimitUseNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usca | 8 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usca | 8 | SharingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usca | 8 | SensitiveDataProcessing | 2 bit int array of size 9. 0=Not applicable, 1=Yes, 2=No | +| usca | 8 | KnownChildSensitiveDataConsents | 2 bit int array of size 2. 0=Not applicable, 1=Yes, 2=No | +| usca | 8 | PersonalDataConsents | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usca | 8 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usca | 8 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usca | 8 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usca | 8 | GpcSegmentType | 2 bit int. Value is 1 | +| usca | 8 | GpcSegmentIncluded | Boolean. Default is true | +| usca | 8 | Gpc | Boolean | +| usva | 9 | Version | 6 bit int. Value is 1 | +| usva | 9 | SharingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usva | 9 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usva | 9 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usva | 9 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usva | 9 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usva | 9 | SensitiveDataProcessing | 2 bit int array of size 8. 0=Not applicable, 1=Yes, 2=No | +| usva | 9 | KnownChildSensitiveDataConsents | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usva | 9 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usva | 9 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usva | 9 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usco | 10 | Version | 6 bit int. Value is 1 | +| usco | 10 | SharingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usco | 10 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usco | 10 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usco | 10 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usco | 10 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usco | 10 | SensitiveDataProcessing | 2 bit int array of size 7. 0=Not applicable, 1=Yes, 2=No | +| usco | 10 | KnownChildSensitiveDataConsents | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usco | 10 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usco | 10 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usco | 10 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usco | 10 | GpcSegmentType | 2 bit int. Value is 1 | +| usco | 10 | GpcSegmentIncluded | Boolean. Deafult is true | +| usco | 10 | Gpc | Boolean | +| usut | 11 | Version | 6 bit int. Value is 1 | +| usut | 11 | SharingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usut | 11 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usut | 11 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usut | 11 | SensitiveDataProcessingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usut | 11 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usut | 11 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usut | 11 | SensitiveDataProcessing | 2 bit int array of size 8. 0=Not applicable, 1=Yes, 2=No | +| usut | 11 | KnownChildSensitiveDataConsents | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usut | 11 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usut | 11 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usut | 11 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usct | 12 | Version | 6 bit int. Value is 1 | +| usct | 12 | SharingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usct | 12 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usct | 12 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usct | 12 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usct | 12 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usct | 12 | SensitiveDataProcessing | 2 bit int array of size 8. 0=Not applicable, 1=Yes, 2=No | +| usct | 12 | KnownChildSensitiveDataConsents | 2 bit int array of size 3. 0=Not applicable, 1=Yes, 2=No | +| usct | 12 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usct | 12 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usct | 12 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usct | 12 | GpcSegmentType | 2 bit int. Value is 1 | +| usct | 12 | GpcSegmentIncluded | Boolean. Default is true | +| usct | 12 | Gpc | Boolean | +| usfl | 13 | Version | 6 bit int. Value is 1 | +| usfl | 13 | ProcessingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usfl | 13 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usfl | 13 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usfl | 13 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usfl | 13 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usfl | 13 | SensitiveDataProcessing | 2 bit int array of size 8. 0=Not applicable, 1=Yes, 2=No | +| usfl | 13 | KnownChildSensitiveDataConsents | 2 bit int array of size 3. 0=Not applicable, 1=Yes, 2=No | +| usfl | 13 | AdditionalDataProcessingConsent | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usfl | 13 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usfl | 13 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usfl | 13 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmt | 14 | Version | 6 bit int. Value is 1 | +| usmt | 14 | SharingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmt | 14 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmt | 14 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmt | 14 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmt | 14 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmt | 14 | SensitiveDataProcessing | 2 bit int array of size 8. 0=Not applicable, 1=Yes, 2=No | +| usmt | 14 | KnownChildSensitiveDataConsents | 2 bit int array of size 3. 0=Not applicable, 1=Yes, 2=No | +| usmt | 14 | AdditionalDataProcessingConsent | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmt | 14 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmt | 14 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmt | 14 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usmt | 14 | GpcSegmentType | 2 bit int. Value is 1 | +| usmt | 14 | GpcSegmentIncluded | Boolean. Default is true | +| usmt | 14 | Gpc | Boolean | +| usor | 15 | Version | 6 bit int. Value is 1 | +| usor | 15 | ProcessingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usor | 15 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usor | 15 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usor | 15 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usor | 15 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usor | 15 | SensitiveDataProcessing | 2 bit int array of size 11. 0=Not applicable, 1=Yes, 2=No | +| usor | 15 | KnownChildSensitiveDataConsents | 2 bit int array of size 3. 0=Not applicable, 1=Yes, 2=No | +| usor | 15 | AdditionalDataProcessingConsent | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usor | 15 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usor | 15 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usor | 15 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usor | 15 | GpcSegmentType | 2 bit int. Value is 1 | +| usor | 15 | GpcSegmentIncluded | Boolean. Default is true | +| usor | 15 | Gpc | Boolean | +| ustx | 16 | Version | 6 bit int. Value is 1 | +| ustx | 16 | ProcessingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustx | 16 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustx | 16 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustx | 16 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustx | 16 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustx | 16 | SensitiveDataProcessing | 2 bit int array of size 8. 0=Not applicable, 1=Yes, 2=No | +| ustx | 16 | KnownChildSensitiveDataConsents | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustx | 16 | AdditionalDataProcessingConsent | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustx | 16 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustx | 16 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustx | 16 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustx | 16 | GpcSegmentType | 2 bit int. Value is 1 | +| ustx | 16 | GpcSegmentIncluded | Boolean. Default is true | +| ustx | 16 | Gpc | Boolean | +| usde | 17 | Version | 6 bit int. Value is 1 | +| usde | 17 | ProcessingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | SensitiveDataProcessing | 2 bit int array of size 9. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | KnownChildSensitiveDataConsents | 2 bit int array of size 5. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | AdditionalDataProcessingConsent | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usde | 17 | GpcSegmentType | 2 bit int. Value is 1 | +| usde | 17 | GpcSegmentIncluded | Boolean. Default is true | +| usde | 17 | Gpc | Boolean | +| usia | 18 | Version | 6 bit int. Value is 1 | +| usia | 18 | ProcessingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | SensitiveDataOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | SensitiveDataProcessing | 2 bit int array of size 8. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | KnownChildSensitiveDataConsents | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usia | 18 | GpcSegmentType | 2 bit int. Value is 1 | +| usia | 18 | GpcSegmentIncluded | Boolean. Default is true | +| usia | 18 | Gpc | Boolean | +| usne | 19 | Version | 6 bit int. Value is 1 | +| usne | 19 | ProcessingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | SensitiveDataProcessing | 2 bit int array of size 8. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | KnownChildSensitiveDataConsents | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | AdditionalDataProcessingConsent | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usne | 19 | GpcSegmentType | 2 bit int. Value is 1 | +| usne | 19 | GpcSegmentIncluded | Boolean. Default is true | +| usne | 19 | Gpc | Boolean | +| usnh | 20 | Version | 6 bit int. Value is 1 | +| usnh | 20 | ProcessingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | SensitiveDataProcessing | 2 bit int array of size 8. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | KnownChildSensitiveDataConsents | 2 bit int array of size 3. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | AdditionalDataProcessingConsent | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnh | 20 | GpcSegmentType | 2 bit int. Value is 1 | +| usnh | 20 | GpcSegmentIncluded | Boolean. Default is true | +| usnh | 20 | Gpc | Boolean | +| usnj | 21 | Version | 6 bit int. Value is 1 | +| usnj | 21 | ProcessingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | SensitiveDataProcessing | 2 bit int array of size 10. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | KnownChildSensitiveDataConsents | 2 bit int array of size 5. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | AdditionalDataProcessingConsent | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| usnj | 21 | GpcSegmentType | 2 bit int. Value is 1 | +| usnj | 21 | GpcSegmentIncluded | Boolean. Default is true | +| usnj | 21 | Gpc | Boolean | +| ustn | 22 | Version | 6 bit int. Value is 1 | +| ustn | 22 | ProcessingNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | SaleOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | TargetedAdvertisingOptOutNotice | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | SensitiveDataProcessing | 2 bit int array of size 8. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | KnownChildSensitiveDataConsents | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | AdditionalDataProcessingConsent | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | MspaServiceProviderMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | +| ustn | 22 | GpcSegmentType | 2 bit int. Value is 1 | +| ustn | 22 | GpcSegmentIncluded | Boolean. Default is true | +| ustn | 22 | Gpc | Boolean | ## Example Usage / Encoder / Decoder diff --git a/modules/cmpapi/src/encoder/GppModel.ts b/modules/cmpapi/src/encoder/GppModel.ts index b534da9..4b179bf 100644 --- a/modules/cmpapi/src/encoder/GppModel.ts +++ b/modules/cmpapi/src/encoder/GppModel.ts @@ -17,6 +17,12 @@ import { UsTx } from "./section/UsTx.js"; import { InvalidFieldError } from "./error/InvalidFieldError.js"; import { DecodingError } from "./error/DecodingError.js"; import { HeaderV1Field } from "./field/HeaderV1Field.js"; +import { UsDe } from "./section/UsDe.js"; +import { UsIa } from "./section/UsIa.js"; +import { UsNe } from "./section/UsNe.js"; +import { UsNh } from "./section/UsNh.js"; +import { UsNj } from "./section/UsNj.js"; +import { UsTn } from "./section/UsTn.js"; export class GppModel { private sections = new Map(); @@ -79,6 +85,24 @@ export class GppModel { } else if (sectionName === UsTx.NAME) { section = new UsTx(); this.sections.set(UsTx.NAME, section); + } else if (sectionName === UsDe.NAME) { + section = new UsDe(); + this.sections.set(UsDe.NAME, section); + } else if (sectionName === UsIa.NAME) { + section = new UsIa(); + this.sections.set(UsIa.NAME, section); + } else if (sectionName === UsNe.NAME) { + section = new UsNe(); + this.sections.set(UsNe.NAME, section); + } else if (sectionName === UsNh.NAME) { + section = new UsNh(); + this.sections.set(UsNh.NAME, section); + } else if (sectionName === UsNj.NAME) { + section = new UsNj(); + this.sections.set(UsNj.NAME, section); + } else if (sectionName === UsTn.NAME) { + section = new UsTn(); + this.sections.set(UsTn.NAME, section); } } else { section = this.sections.get(sectionName); @@ -291,6 +315,24 @@ export class GppModel { } else if (sectionIds[i] === UsTx.ID) { let section = new UsTx(encodedSections[i + 1]); sections.set(UsTx.NAME, section); + } else if (sectionIds[i] === UsDe.ID) { + let section = new UsDe(encodedSections[i + 1]); + sections.set(UsDe.NAME, section); + } else if (sectionIds[i] === UsIa.ID) { + let section = new UsIa(encodedSections[i + 1]); + sections.set(UsIa.NAME, section); + } else if (sectionIds[i] === UsNe.ID) { + let section = new UsNe(encodedSections[i + 1]); + sections.set(UsNe.NAME, section); + } else if (sectionIds[i] === UsNh.ID) { + let section = new UsNh(encodedSections[i + 1]); + sections.set(UsNh.NAME, section); + } else if (sectionIds[i] === UsNj.ID) { + let section = new UsNj(encodedSections[i + 1]); + sections.set(UsNj.NAME, section); + } else if (sectionIds[i] === UsTn.ID) { + let section = new UsTn(encodedSections[i + 1]); + sections.set(UsTn.NAME, section); } } } @@ -372,6 +414,24 @@ export class GppModel { } else if (sectionName === UsTx.NAME) { section = new UsTx(); this.sections.set(UsTx.NAME, section); + } else if (sectionName === UsDe.NAME) { + section = new UsDe(); + this.sections.set(UsDe.NAME, section); + } else if (sectionName === UsIa.NAME) { + section = new UsIa(); + this.sections.set(UsIa.NAME, section); + } else if (sectionName === UsNe.NAME) { + section = new UsNe(); + this.sections.set(UsNe.NAME, section); + } else if (sectionName === UsNh.NAME) { + section = new UsNh(); + this.sections.set(UsNh.NAME, section); + } else if (sectionName === UsNj.NAME) { + section = new UsNj(); + this.sections.set(UsNj.NAME, section); + } else if (sectionName === UsTn.NAME) { + section = new UsTn(); + this.sections.set(UsTn.NAME, section); } } else { section = this.sections.get(sectionName); diff --git a/modules/cmpapi/src/encoder/field/UsDeField.ts b/modules/cmpapi/src/encoder/field/UsDeField.ts new file mode 100644 index 0000000..47306a7 --- /dev/null +++ b/modules/cmpapi/src/encoder/field/UsDeField.ts @@ -0,0 +1,35 @@ +export enum UsDeField { + VERSION = "Version", + PROCESSING_NOTICE = "ProcessingNotice", + SALE_OPT_OUT_NOTICE = "SaleOptOutNotice", + TARGETED_ADVERTISING_OPT_OUT_NOTICE = "TargetedAdvertisingOptOutNotice", + SALE_OPT_OUT = "SaleOptOut", + TARGETED_ADVERTISING_OPT_OUT = "TargetedAdvertisingOptOut", + SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing", + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS = "KnownChildSensitiveDataConsents", + ADDITIONAL_DATA_PROCESSING_CONSENT = "AdditionalDataProcessingConsent", + MSPA_COVERED_TRANSACTION = "MspaCoveredTransaction", + MSPA_OPT_OUT_OPTION_MODE = "MspaOptOutOptionMode", + MSPA_SERVICE_PROVIDER_MODE = "MspaServiceProviderMode", + + GPC_SEGMENT_TYPE = "GpcSegmentType", + GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded", + GPC = "Gpc", +} + +export const USDE_CORE_SEGMENT_FIELD_NAMES = [ + UsDeField.VERSION, + UsDeField.PROCESSING_NOTICE, + UsDeField.SALE_OPT_OUT_NOTICE, + UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + UsDeField.SALE_OPT_OUT, + UsDeField.TARGETED_ADVERTISING_OPT_OUT, + UsDeField.SENSITIVE_DATA_PROCESSING, + UsDeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + UsDeField.ADDITIONAL_DATA_PROCESSING_CONSENT, + UsDeField.MSPA_COVERED_TRANSACTION, + UsDeField.MSPA_OPT_OUT_OPTION_MODE, + UsDeField.MSPA_SERVICE_PROVIDER_MODE, +]; + +export const USDE_GPC_SEGMENT_FIELD_NAMES = [UsDeField.GPC_SEGMENT_TYPE, UsDeField.GPC]; diff --git a/modules/cmpapi/src/encoder/field/UsIaField.ts b/modules/cmpapi/src/encoder/field/UsIaField.ts new file mode 100644 index 0000000..2045d87 --- /dev/null +++ b/modules/cmpapi/src/encoder/field/UsIaField.ts @@ -0,0 +1,35 @@ +export enum UsIaField { + VERSION = "Version", + PROCESSING_NOTICE = "ProcessingNotice", + SALE_OPT_OUT_NOTICE = "SaleOptOutNotice", + TARGETED_ADVERTISING_OPT_OUT_NOTICE = "TargetedAdvertisingOptOutNotice", + SENSITIVE_DATA_OPT_OUT_NOTICE = "SensitiveDataOptOutNotice", + SALE_OPT_OUT = "SaleOptOut", + TARGETED_ADVERTISING_OPT_OUT = "TargetedAdvertisingOptOut", + SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing", + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS = "KnownChildSensitiveDataConsents", + MSPA_COVERED_TRANSACTION = "MspaCoveredTransaction", + MSPA_OPT_OUT_OPTION_MODE = "MspaOptOutOptionMode", + MSPA_SERVICE_PROVIDER_MODE = "MspaServiceProviderMode", + + GPC_SEGMENT_TYPE = "GpcSegmentType", + GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded", + GPC = "Gpc", +} + +export const USIA_CORE_SEGMENT_FIELD_NAMES = [ + UsIaField.VERSION, + UsIaField.PROCESSING_NOTICE, + UsIaField.SALE_OPT_OUT_NOTICE, + UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + UsIaField.SENSITIVE_DATA_OPT_OUT_NOTICE, + UsIaField.SALE_OPT_OUT, + UsIaField.TARGETED_ADVERTISING_OPT_OUT, + UsIaField.SENSITIVE_DATA_PROCESSING, + UsIaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + UsIaField.MSPA_COVERED_TRANSACTION, + UsIaField.MSPA_OPT_OUT_OPTION_MODE, + UsIaField.MSPA_SERVICE_PROVIDER_MODE, +]; + +export const USIA_GPC_SEGMENT_FIELD_NAMES = [UsIaField.GPC_SEGMENT_TYPE, UsIaField.GPC]; diff --git a/modules/cmpapi/src/encoder/field/UsNeField.ts b/modules/cmpapi/src/encoder/field/UsNeField.ts new file mode 100644 index 0000000..3a30904 --- /dev/null +++ b/modules/cmpapi/src/encoder/field/UsNeField.ts @@ -0,0 +1,35 @@ +export enum UsNeField { + VERSION = "Version", + PROCESSING_NOTICE = "ProcessingNotice", + SALE_OPT_OUT_NOTICE = "SaleOptOutNotice", + TARGETED_ADVERTISING_OPT_OUT_NOTICE = "TargetedAdvertisingOptOutNotice", + SALE_OPT_OUT = "SaleOptOut", + TARGETED_ADVERTISING_OPT_OUT = "TargetedAdvertisingOptOut", + SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing", + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS = "KnownChildSensitiveDataConsents", + ADDITIONAL_DATA_PROCESSING_CONSENT = "AdditionalDataProcessingConsent", + MSPA_COVERED_TRANSACTION = "MspaCoveredTransaction", + MSPA_OPT_OUT_OPTION_MODE = "MspaOptOutOptionMode", + MSPA_SERVICE_PROVIDER_MODE = "MspaServiceProviderMode", + + GPC_SEGMENT_TYPE = "GpcSegmentType", + GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded", + GPC = "Gpc", +} + +export const USNE_CORE_SEGMENT_FIELD_NAMES = [ + UsNeField.VERSION, + UsNeField.PROCESSING_NOTICE, + UsNeField.SALE_OPT_OUT_NOTICE, + UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + UsNeField.SALE_OPT_OUT, + UsNeField.TARGETED_ADVERTISING_OPT_OUT, + UsNeField.SENSITIVE_DATA_PROCESSING, + UsNeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + UsNeField.ADDITIONAL_DATA_PROCESSING_CONSENT, + UsNeField.MSPA_COVERED_TRANSACTION, + UsNeField.MSPA_OPT_OUT_OPTION_MODE, + UsNeField.MSPA_SERVICE_PROVIDER_MODE, +]; + +export const USNE_GPC_SEGMENT_FIELD_NAMES = [UsNeField.GPC_SEGMENT_TYPE, UsNeField.GPC]; diff --git a/modules/cmpapi/src/encoder/field/UsNhField.ts b/modules/cmpapi/src/encoder/field/UsNhField.ts new file mode 100644 index 0000000..1c479c6 --- /dev/null +++ b/modules/cmpapi/src/encoder/field/UsNhField.ts @@ -0,0 +1,35 @@ +export enum UsNhField { + VERSION = "Version", + PROCESSING_NOTICE = "ProcessingNotice", + SALE_OPT_OUT_NOTICE = "SaleOptOutNotice", + TARGETED_ADVERTISING_OPT_OUT_NOTICE = "TargetedAdvertisingOptOutNotice", + SALE_OPT_OUT = "SaleOptOut", + TARGETED_ADVERTISING_OPT_OUT = "TargetedAdvertisingOptOut", + SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing", + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS = "KnownChildSensitiveDataConsents", + ADDITIONAL_DATA_PROCESSING_CONSENT = "AdditionalDataProcessingConsent", + MSPA_COVERED_TRANSACTION = "MspaCoveredTransaction", + MSPA_OPT_OUT_OPTION_MODE = "MspaOptOutOptionMode", + MSPA_SERVICE_PROVIDER_MODE = "MspaServiceProviderMode", + + GPC_SEGMENT_TYPE = "GpcSegmentType", + GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded", + GPC = "Gpc", +} + +export const USNH_CORE_SEGMENT_FIELD_NAMES = [ + UsNhField.VERSION, + UsNhField.PROCESSING_NOTICE, + UsNhField.SALE_OPT_OUT_NOTICE, + UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + UsNhField.SALE_OPT_OUT, + UsNhField.TARGETED_ADVERTISING_OPT_OUT, + UsNhField.SENSITIVE_DATA_PROCESSING, + UsNhField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + UsNhField.ADDITIONAL_DATA_PROCESSING_CONSENT, + UsNhField.MSPA_COVERED_TRANSACTION, + UsNhField.MSPA_OPT_OUT_OPTION_MODE, + UsNhField.MSPA_SERVICE_PROVIDER_MODE, +]; + +export const USNH_GPC_SEGMENT_FIELD_NAMES = [UsNhField.GPC_SEGMENT_TYPE, UsNhField.GPC]; diff --git a/modules/cmpapi/src/encoder/field/UsNjField.ts b/modules/cmpapi/src/encoder/field/UsNjField.ts new file mode 100644 index 0000000..8474617 --- /dev/null +++ b/modules/cmpapi/src/encoder/field/UsNjField.ts @@ -0,0 +1,35 @@ +export enum UsNjField { + VERSION = "Version", + PROCESSING_NOTICE = "ProcessingNotice", + SALE_OPT_OUT_NOTICE = "SaleOptOutNotice", + TARGETED_ADVERTISING_OPT_OUT_NOTICE = "TargetedAdvertisingOptOutNotice", + SALE_OPT_OUT = "SaleOptOut", + TARGETED_ADVERTISING_OPT_OUT = "TargetedAdvertisingOptOut", + SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing", + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS = "KnownChildSensitiveDataConsents", + ADDITIONAL_DATA_PROCESSING_CONSENT = "AdditionalDataProcessingConsent", + MSPA_COVERED_TRANSACTION = "MspaCoveredTransaction", + MSPA_OPT_OUT_OPTION_MODE = "MspaOptOutOptionMode", + MSPA_SERVICE_PROVIDER_MODE = "MspaServiceProviderMode", + + GPC_SEGMENT_TYPE = "GpcSegmentType", + GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded", + GPC = "Gpc", +} + +export const USNJ_CORE_SEGMENT_FIELD_NAMES = [ + UsNjField.VERSION, + UsNjField.PROCESSING_NOTICE, + UsNjField.SALE_OPT_OUT_NOTICE, + UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + UsNjField.SALE_OPT_OUT, + UsNjField.TARGETED_ADVERTISING_OPT_OUT, + UsNjField.SENSITIVE_DATA_PROCESSING, + UsNjField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + UsNjField.ADDITIONAL_DATA_PROCESSING_CONSENT, + UsNjField.MSPA_COVERED_TRANSACTION, + UsNjField.MSPA_OPT_OUT_OPTION_MODE, + UsNjField.MSPA_SERVICE_PROVIDER_MODE, +]; + +export const USNJ_GPC_SEGMENT_FIELD_NAMES = [UsNjField.GPC_SEGMENT_TYPE, UsNjField.GPC]; diff --git a/modules/cmpapi/src/encoder/field/UsTnField.ts b/modules/cmpapi/src/encoder/field/UsTnField.ts new file mode 100644 index 0000000..64b97fc --- /dev/null +++ b/modules/cmpapi/src/encoder/field/UsTnField.ts @@ -0,0 +1,35 @@ +export enum UsTnField { + VERSION = "Version", + PROCESSING_NOTICE = "ProcessingNotice", + SALE_OPT_OUT_NOTICE = "SaleOptOutNotice", + TARGETED_ADVERTISING_OPT_OUT_NOTICE = "TargetedAdvertisingOptOutNotice", + SALE_OPT_OUT = "SaleOptOut", + TARGETED_ADVERTISING_OPT_OUT = "TargetedAdvertisingOptOut", + SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing", + KNOWN_CHILD_SENSITIVE_DATA_CONSENTS = "KnownChildSensitiveDataConsents", + ADDITIONAL_DATA_PROCESSING_CONSENT = "AdditionalDataProcessingConsent", + MSPA_COVERED_TRANSACTION = "MspaCoveredTransaction", + MSPA_OPT_OUT_OPTION_MODE = "MspaOptOutOptionMode", + MSPA_SERVICE_PROVIDER_MODE = "MspaServiceProviderMode", + + GPC_SEGMENT_TYPE = "GpcSegmentType", + GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded", + GPC = "Gpc", +} + +export const USTN_CORE_SEGMENT_FIELD_NAMES = [ + UsTnField.VERSION, + UsTnField.PROCESSING_NOTICE, + UsTnField.SALE_OPT_OUT_NOTICE, + UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, + UsTnField.SALE_OPT_OUT, + UsTnField.TARGETED_ADVERTISING_OPT_OUT, + UsTnField.SENSITIVE_DATA_PROCESSING, + UsTnField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, + UsTnField.ADDITIONAL_DATA_PROCESSING_CONSENT, + UsTnField.MSPA_COVERED_TRANSACTION, + UsTnField.MSPA_OPT_OUT_OPTION_MODE, + UsTnField.MSPA_SERVICE_PROVIDER_MODE, +]; + +export const USTN_GPC_SEGMENT_FIELD_NAMES = [UsTnField.GPC_SEGMENT_TYPE, UsTnField.GPC]; diff --git a/modules/cmpapi/src/encoder/field/index.ts b/modules/cmpapi/src/encoder/field/index.ts index 28a912d..e545d20 100644 --- a/modules/cmpapi/src/encoder/field/index.ts +++ b/modules/cmpapi/src/encoder/field/index.ts @@ -7,10 +7,16 @@ export * from "./TcfEuV2Field.js"; export * from "./UsCaField.js"; export * from "./UsCoField.js"; export * from "./UsCtField.js"; +export * from "./UsDeField.js"; export * from "./UsFlField.js"; +export * from "./UsIaField.js"; export * from "./UsMtField.js"; export * from "./UsNatField.js"; +export * from "./UsNeField.js"; +export * from "./UsNhField.js"; +export * from "./UsNjField.js"; export * from "./UsOrField.js"; +export * from "./UsTnField.js"; export * from "./UsTxField.js"; export * from "./UsUtField.js"; export * from "./UspV1Field.js"; diff --git a/modules/cmpapi/src/encoder/section/Sections.ts b/modules/cmpapi/src/encoder/section/Sections.ts index a26bd3d..782661d 100644 --- a/modules/cmpapi/src/encoder/section/Sections.ts +++ b/modules/cmpapi/src/encoder/section/Sections.ts @@ -11,6 +11,12 @@ import { UsFl } from "./UsFl.js"; import { UsMt } from "./UsMt.js"; import { UsOr } from "./UsOr.js"; import { UsTx } from "./UsTx.js"; +import { UsDe } from "./UsDe.js"; +import { UsIa } from "./UsIa.js"; +import { UsNe } from "./UsNe.js"; +import { UsNh } from "./UsNh.js"; +import { UsNj } from "./UsNj.js"; +import { UsTn } from "./UsTn.js"; export class Sections { public static SECTION_ID_NAME_MAP = new Map([ @@ -27,6 +33,12 @@ export class Sections { [UsMt.ID, UsMt.NAME], [UsOr.ID, UsOr.NAME], [UsTx.ID, UsTx.NAME], + [UsDe.ID, UsDe.NAME], + [UsIa.ID, UsIa.NAME], + [UsNe.ID, UsNe.NAME], + [UsNh.ID, UsNh.NAME], + [UsNj.ID, UsNj.NAME], + [UsTn.ID, UsTn.NAME], ]); public static SECTION_ORDER = [ TcfEuV2.NAME, @@ -42,5 +54,11 @@ export class Sections { UsMt.NAME, UsOr.NAME, UsTx.NAME, + UsDe.NAME, + UsIa.NAME, + UsNe.NAME, + UsNh.NAME, + UsNj.NAME, + UsTn.NAME, ]; } diff --git a/modules/cmpapi/src/encoder/section/UsDe.ts b/modules/cmpapi/src/encoder/section/UsDe.ts new file mode 100644 index 0000000..f07b68a --- /dev/null +++ b/modules/cmpapi/src/encoder/section/UsDe.ts @@ -0,0 +1,77 @@ +import { UsDeField } from "../field/UsDeField.js"; +import { EncodableSegment } from "../segment/EncodableSegment.js"; +import { UsDeCoreSegment } from "../segment/UsDeCoreSegment.js"; +import { UsDeGpcSegment } from "../segment/UsDeGpcSegment.js"; +import { AbstractLazilyEncodableSection } from "./AbstractLazilyEncodableSection.js"; + +export class UsDe extends AbstractLazilyEncodableSection { + public static readonly ID = 17; + public static readonly VERSION = 1; + public static readonly NAME = "usde"; + + constructor(encodedString?: string) { + super(); + if (encodedString && encodedString.length > 0) { + this.decode(encodedString); + } + } + + //Overriden + public getId(): number { + return UsDe.ID; + } + + //Overriden + public getName(): string { + return UsDe.NAME; + } + + //Override + public getVersion(): number { + return UsDe.VERSION; + } + + //Overriden + protected initializeSegments(): EncodableSegment[] { + let segments: EncodableSegment[] = []; + segments.push(new UsDeCoreSegment()); + segments.push(new UsDeGpcSegment()); + return segments; + } + + //Overriden + protected decodeSection(encodedString: string): EncodableSegment[] { + let segments: EncodableSegment[] = this.initializeSegments(); + + if (encodedString != null && encodedString.length !== 0) { + let encodedSegments = encodedString.split("."); + + if (encodedSegments.length > 0) { + segments[0].decode(encodedSegments[0]); + } + + if (encodedSegments.length > 1) { + segments[1].setFieldValue(UsDeField.GPC_SEGMENT_INCLUDED, true); + segments[1].decode(encodedSegments[1]); + } else { + segments[1].setFieldValue(UsDeField.GPC_SEGMENT_INCLUDED, false); + } + } + + return segments; + } + + // Overriden + protected encodeSection(segments: EncodableSegment[]): string { + let encodedSegments: string[] = []; + + if (segments.length >= 1) { + encodedSegments.push(segments[0].encode()); + if (segments.length >= 2 && segments[1].getFieldValue(UsDeField.GPC_SEGMENT_INCLUDED) === true) { + encodedSegments.push(segments[1].encode()); + } + } + + return encodedSegments.join("."); + } +} diff --git a/modules/cmpapi/src/encoder/section/UsIa.ts b/modules/cmpapi/src/encoder/section/UsIa.ts new file mode 100644 index 0000000..5637465 --- /dev/null +++ b/modules/cmpapi/src/encoder/section/UsIa.ts @@ -0,0 +1,77 @@ +import { UsIaField } from "../field/UsIaField.js"; +import { EncodableSegment } from "../segment/EncodableSegment.js"; +import { UsIaCoreSegment } from "../segment/UsIaCoreSegment.js"; +import { UsIaGpcSegment } from "../segment/UsIaGpcSegment.js"; +import { AbstractLazilyEncodableSection } from "./AbstractLazilyEncodableSection.js"; + +export class UsIa extends AbstractLazilyEncodableSection { + public static readonly ID = 18; + public static readonly VERSION = 1; + public static readonly NAME = "usia"; + + constructor(encodedString?: string) { + super(); + if (encodedString && encodedString.length > 0) { + this.decode(encodedString); + } + } + + //Overriden + public getId(): number { + return UsIa.ID; + } + + //Overriden + public getName(): string { + return UsIa.NAME; + } + + //Override + public getVersion(): number { + return UsIa.VERSION; + } + + //Overriden + protected initializeSegments(): EncodableSegment[] { + let segments: EncodableSegment[] = []; + segments.push(new UsIaCoreSegment()); + segments.push(new UsIaGpcSegment()); + return segments; + } + + //Overriden + protected decodeSection(encodedString: string): EncodableSegment[] { + let segments: EncodableSegment[] = this.initializeSegments(); + + if (encodedString != null && encodedString.length !== 0) { + let encodedSegments = encodedString.split("."); + + if (encodedSegments.length > 0) { + segments[0].decode(encodedSegments[0]); + } + + if (encodedSegments.length > 1) { + segments[1].setFieldValue(UsIaField.GPC_SEGMENT_INCLUDED, true); + segments[1].decode(encodedSegments[1]); + } else { + segments[1].setFieldValue(UsIaField.GPC_SEGMENT_INCLUDED, false); + } + } + + return segments; + } + + // Overriden + protected encodeSection(segments: EncodableSegment[]): string { + let encodedSegments: string[] = []; + + if (segments.length >= 1) { + encodedSegments.push(segments[0].encode()); + if (segments.length >= 2 && segments[1].getFieldValue(UsIaField.GPC_SEGMENT_INCLUDED) === true) { + encodedSegments.push(segments[1].encode()); + } + } + + return encodedSegments.join("."); + } +} diff --git a/modules/cmpapi/src/encoder/section/UsNe.ts b/modules/cmpapi/src/encoder/section/UsNe.ts new file mode 100644 index 0000000..dfc1092 --- /dev/null +++ b/modules/cmpapi/src/encoder/section/UsNe.ts @@ -0,0 +1,77 @@ +import { UsNeField } from "../field/UsNeField.js"; +import { EncodableSegment } from "../segment/EncodableSegment.js"; +import { UsNeCoreSegment } from "../segment/UsNeCoreSegment.js"; +import { UsNeGpcSegment } from "../segment/UsNeGpcSegment.js"; +import { AbstractLazilyEncodableSection } from "./AbstractLazilyEncodableSection.js"; + +export class UsNe extends AbstractLazilyEncodableSection { + public static readonly ID = 19; + public static readonly VERSION = 1; + public static readonly NAME = "usne"; + + constructor(encodedString?: string) { + super(); + if (encodedString && encodedString.length > 0) { + this.decode(encodedString); + } + } + + //Overriden + public getId(): number { + return UsNe.ID; + } + + //Overriden + public getName(): string { + return UsNe.NAME; + } + + //Override + public getVersion(): number { + return UsNe.VERSION; + } + + //Overriden + protected initializeSegments(): EncodableSegment[] { + let segments: EncodableSegment[] = []; + segments.push(new UsNeCoreSegment()); + segments.push(new UsNeGpcSegment()); + return segments; + } + + //Overriden + protected decodeSection(encodedString: string): EncodableSegment[] { + let segments: EncodableSegment[] = this.initializeSegments(); + + if (encodedString != null && encodedString.length !== 0) { + let encodedSegments = encodedString.split("."); + + if (encodedSegments.length > 0) { + segments[0].decode(encodedSegments[0]); + } + + if (encodedSegments.length > 1) { + segments[1].setFieldValue(UsNeField.GPC_SEGMENT_INCLUDED, true); + segments[1].decode(encodedSegments[1]); + } else { + segments[1].setFieldValue(UsNeField.GPC_SEGMENT_INCLUDED, false); + } + } + + return segments; + } + + // Overriden + protected encodeSection(segments: EncodableSegment[]): string { + let encodedSegments: string[] = []; + + if (segments.length >= 1) { + encodedSegments.push(segments[0].encode()); + if (segments.length >= 2 && segments[1].getFieldValue(UsNeField.GPC_SEGMENT_INCLUDED) === true) { + encodedSegments.push(segments[1].encode()); + } + } + + return encodedSegments.join("."); + } +} diff --git a/modules/cmpapi/src/encoder/section/UsNh.ts b/modules/cmpapi/src/encoder/section/UsNh.ts new file mode 100644 index 0000000..ba00b27 --- /dev/null +++ b/modules/cmpapi/src/encoder/section/UsNh.ts @@ -0,0 +1,77 @@ +import { UsNhField } from "../field/UsNhField.js"; +import { EncodableSegment } from "../segment/EncodableSegment.js"; +import { UsNhCoreSegment } from "../segment/UsNhCoreSegment.js"; +import { UsNhGpcSegment } from "../segment/UsNhGpcSegment.js"; +import { AbstractLazilyEncodableSection } from "./AbstractLazilyEncodableSection.js"; + +export class UsNh extends AbstractLazilyEncodableSection { + public static readonly ID = 20; + public static readonly VERSION = 1; + public static readonly NAME = "usnh"; + + constructor(encodedString?: string) { + super(); + if (encodedString && encodedString.length > 0) { + this.decode(encodedString); + } + } + + //Overriden + public getId(): number { + return UsNh.ID; + } + + //Overriden + public getName(): string { + return UsNh.NAME; + } + + //Override + public getVersion(): number { + return UsNh.VERSION; + } + + //Overriden + protected initializeSegments(): EncodableSegment[] { + let segments: EncodableSegment[] = []; + segments.push(new UsNhCoreSegment()); + segments.push(new UsNhGpcSegment()); + return segments; + } + + //Overriden + protected decodeSection(encodedString: string): EncodableSegment[] { + let segments: EncodableSegment[] = this.initializeSegments(); + + if (encodedString != null && encodedString.length !== 0) { + let encodedSegments = encodedString.split("."); + + if (encodedSegments.length > 0) { + segments[0].decode(encodedSegments[0]); + } + + if (encodedSegments.length > 1) { + segments[1].setFieldValue(UsNhField.GPC_SEGMENT_INCLUDED, true); + segments[1].decode(encodedSegments[1]); + } else { + segments[1].setFieldValue(UsNhField.GPC_SEGMENT_INCLUDED, false); + } + } + + return segments; + } + + // Overriden + protected encodeSection(segments: EncodableSegment[]): string { + let encodedSegments: string[] = []; + + if (segments.length >= 1) { + encodedSegments.push(segments[0].encode()); + if (segments.length >= 2 && segments[1].getFieldValue(UsNhField.GPC_SEGMENT_INCLUDED) === true) { + encodedSegments.push(segments[1].encode()); + } + } + + return encodedSegments.join("."); + } +} diff --git a/modules/cmpapi/src/encoder/section/UsNj.ts b/modules/cmpapi/src/encoder/section/UsNj.ts new file mode 100644 index 0000000..163b630 --- /dev/null +++ b/modules/cmpapi/src/encoder/section/UsNj.ts @@ -0,0 +1,77 @@ +import { UsNjField } from "../field/UsNjField.js"; +import { EncodableSegment } from "../segment/EncodableSegment.js"; +import { UsNjCoreSegment } from "../segment/UsNjCoreSegment.js"; +import { UsNjGpcSegment } from "../segment/UsNjGpcSegment.js"; +import { AbstractLazilyEncodableSection } from "./AbstractLazilyEncodableSection.js"; + +export class UsNj extends AbstractLazilyEncodableSection { + public static readonly ID = 21; + public static readonly VERSION = 1; + public static readonly NAME = "usnj"; + + constructor(encodedString?: string) { + super(); + if (encodedString && encodedString.length > 0) { + this.decode(encodedString); + } + } + + //Overriden + public getId(): number { + return UsNj.ID; + } + + //Overriden + public getName(): string { + return UsNj.NAME; + } + + //Override + public getVersion(): number { + return UsNj.VERSION; + } + + //Overriden + protected initializeSegments(): EncodableSegment[] { + let segments: EncodableSegment[] = []; + segments.push(new UsNjCoreSegment()); + segments.push(new UsNjGpcSegment()); + return segments; + } + + //Overriden + protected decodeSection(encodedString: string): EncodableSegment[] { + let segments: EncodableSegment[] = this.initializeSegments(); + + if (encodedString != null && encodedString.length !== 0) { + let encodedSegments = encodedString.split("."); + + if (encodedSegments.length > 0) { + segments[0].decode(encodedSegments[0]); + } + + if (encodedSegments.length > 1) { + segments[1].setFieldValue(UsNjField.GPC_SEGMENT_INCLUDED, true); + segments[1].decode(encodedSegments[1]); + } else { + segments[1].setFieldValue(UsNjField.GPC_SEGMENT_INCLUDED, false); + } + } + + return segments; + } + + // Overriden + protected encodeSection(segments: EncodableSegment[]): string { + let encodedSegments: string[] = []; + + if (segments.length >= 1) { + encodedSegments.push(segments[0].encode()); + if (segments.length >= 2 && segments[1].getFieldValue(UsNjField.GPC_SEGMENT_INCLUDED) === true) { + encodedSegments.push(segments[1].encode()); + } + } + + return encodedSegments.join("."); + } +} diff --git a/modules/cmpapi/src/encoder/section/UsTn.ts b/modules/cmpapi/src/encoder/section/UsTn.ts new file mode 100644 index 0000000..858558d --- /dev/null +++ b/modules/cmpapi/src/encoder/section/UsTn.ts @@ -0,0 +1,77 @@ +import { UsTnField } from "../field/UsTnField.js"; +import { EncodableSegment } from "../segment/EncodableSegment.js"; +import { UsTnCoreSegment } from "../segment/UsTnCoreSegment.js"; +import { UsTnGpcSegment } from "../segment/UsTnGpcSegment.js"; +import { AbstractLazilyEncodableSection } from "./AbstractLazilyEncodableSection.js"; + +export class UsTn extends AbstractLazilyEncodableSection { + public static readonly ID = 22; + public static readonly VERSION = 1; + public static readonly NAME = "ustn"; + + constructor(encodedString?: string) { + super(); + if (encodedString && encodedString.length > 0) { + this.decode(encodedString); + } + } + + //Overriden + public getId(): number { + return UsTn.ID; + } + + //Overriden + public getName(): string { + return UsTn.NAME; + } + + //Override + public getVersion(): number { + return UsTn.VERSION; + } + + //Overriden + protected initializeSegments(): EncodableSegment[] { + let segments: EncodableSegment[] = []; + segments.push(new UsTnCoreSegment()); + segments.push(new UsTnGpcSegment()); + return segments; + } + + //Overriden + protected decodeSection(encodedString: string): EncodableSegment[] { + let segments: EncodableSegment[] = this.initializeSegments(); + + if (encodedString != null && encodedString.length !== 0) { + let encodedSegments = encodedString.split("."); + + if (encodedSegments.length > 0) { + segments[0].decode(encodedSegments[0]); + } + + if (encodedSegments.length > 1) { + segments[1].setFieldValue(UsTnField.GPC_SEGMENT_INCLUDED, true); + segments[1].decode(encodedSegments[1]); + } else { + segments[1].setFieldValue(UsTnField.GPC_SEGMENT_INCLUDED, false); + } + } + + return segments; + } + + // Overriden + protected encodeSection(segments: EncodableSegment[]): string { + let encodedSegments: string[] = []; + + if (segments.length >= 1) { + encodedSegments.push(segments[0].encode()); + if (segments.length >= 2 && segments[1].getFieldValue(UsTnField.GPC_SEGMENT_INCLUDED) === true) { + encodedSegments.push(segments[1].encode()); + } + } + + return encodedSegments.join("."); + } +} diff --git a/modules/cmpapi/src/encoder/section/index.ts b/modules/cmpapi/src/encoder/section/index.ts index eb6eb27..75227cd 100644 --- a/modules/cmpapi/src/encoder/section/index.ts +++ b/modules/cmpapi/src/encoder/section/index.ts @@ -7,10 +7,15 @@ export * from "./TcfEuV2.js"; export * from "./UsCa.js"; export * from "./UsCo.js"; export * from "./UsCt.js"; +export * from "./UsDe.js"; export * from "./UsFl.js"; +export * from "./UsIa.js"; export * from "./UsMt.js"; export * from "./UsNat.js"; -export * from "./UsMt.js"; +export * from "./UsNe.js"; +export * from "./UsNh.js"; +export * from "./UsNj.js"; +export * from "./UsTn.js"; export * from "./UsTx.js"; export * from "./UsUt.js"; export * from "./UspV1.js"; diff --git a/modules/cmpapi/src/encoder/segment/UsDeCoreSegment.ts b/modules/cmpapi/src/encoder/segment/UsDeCoreSegment.ts new file mode 100644 index 0000000..d008a6f --- /dev/null +++ b/modules/cmpapi/src/encoder/segment/UsDeCoreSegment.ts @@ -0,0 +1,232 @@ +import { AbstractBase64UrlEncoder } from "../base64/AbstractBase64UrlEncoder.js"; +import { CompressedBase64UrlEncoder } from "../base64/CompressedBase64UrlEncoder.js"; +import { BitStringEncoder } from "../bitstring/BitStringEncoder.js"; +import { EncodableFixedInteger } from "../datatype/EncodableFixedInteger.js"; +import { EncodableFixedIntegerList } from "../datatype/EncodableFixedIntegerList.js"; +import { Predicate } from "../datatype/validate/Predicate.js"; +import { DecodingError } from "../error/DecodingError.js"; +import { ValidationError } from "../error/ValidationError.js"; +import { EncodableBitStringFields } from "../field/EncodableBitStringFields.js"; +import { USDE_CORE_SEGMENT_FIELD_NAMES } from "../field/UsDeField.js"; +import { UsDeField } from "../field/UsDeField.js"; +import { UsDe } from "../section/UsDe.js"; +import { AbstractLazilyEncodableSegment } from "./AbstractLazilyEncodableSegment.js"; + +export class UsDeCoreSegment extends AbstractLazilyEncodableSegment { + private base64UrlEncoder: AbstractBase64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); + private bitStringEncoder: BitStringEncoder = BitStringEncoder.getInstance(); + + constructor(encodedString?: string) { + super(); + if (encodedString) { + this.decode(encodedString); + } + } + + // overriden + public getFieldNames(): string[] { + return USDE_CORE_SEGMENT_FIELD_NAMES; + } + + // overriden + protected initializeFields(): EncodableBitStringFields { + const nullableBooleanAsTwoBitIntegerValidator = new (class implements Predicate { + test(n: number): boolean { + return n >= 0 && n <= 2; + } + })(); + + const nonNullableBooleanAsTwoBitIntegerValidator = new (class implements Predicate { + test(n: number): boolean { + return n >= 1 && n <= 2; + } + })(); + const nullableBooleanAsTwoBitIntegerListValidator = new (class implements Predicate { + test(l: number[]): boolean { + for (let i = 0; i < l.length; i++) { + let n = l[i]; + if (n < 0 || n > 2) { + return false; + } + } + return true; + } + })(); + + let fields: EncodableBitStringFields = new EncodableBitStringFields(); + fields.put(UsDeField.VERSION.toString(), new EncodableFixedInteger(6, UsDe.VERSION)); + fields.put( + UsDeField.PROCESSING_NOTICE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsDeField.SALE_OPT_OUT_NOTICE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsDeField.SALE_OPT_OUT.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsDeField.TARGETED_ADVERTISING_OPT_OUT.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsDeField.SENSITIVE_DATA_PROCESSING.toString(), + new EncodableFixedIntegerList(2, [0, 0, 0, 0, 0, 0, 0, 0, 0]).withValidator( + nullableBooleanAsTwoBitIntegerListValidator + ) + ); + fields.put( + UsDeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS.toString(), + new EncodableFixedIntegerList(2, [0, 0, 0, 0, 0]).withValidator(nullableBooleanAsTwoBitIntegerListValidator) + ); + fields.put( + UsDeField.ADDITIONAL_DATA_PROCESSING_CONSENT.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsDeField.MSPA_COVERED_TRANSACTION.toString(), + new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsDeField.MSPA_OPT_OUT_OPTION_MODE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsDeField.MSPA_SERVICE_PROVIDER_MODE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + return fields; + } + + // overriden + protected encodeSegment(fields: EncodableBitStringFields): string { + let bitString: string = this.bitStringEncoder.encode(fields, this.getFieldNames()); + let encodedString: string = this.base64UrlEncoder.encode(bitString); + return encodedString; + } + + // overriden + protected decodeSegment(encodedString: string, fields: EncodableBitStringFields): void { + if (encodedString == null || encodedString.length === 0) { + this.fields.reset(fields); + } + try { + let bitString: string = this.base64UrlEncoder.decode(encodedString); + this.bitStringEncoder.decode(bitString, this.getFieldNames(), fields); + } catch (e) { + throw new DecodingError("Unable to decode UsDeCoreSegment '" + encodedString + "'"); + } + } + + // overriden + public validate(): void { + let saleOptOutNotice: number = this.fields.get(UsDeField.SALE_OPT_OUT_NOTICE).getValue(); + let saleOptOut: number = this.fields.get(UsDeField.SALE_OPT_OUT).getValue(); + let targetedAdvertisingOptOutNotice: number = this.fields + .get(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE) + .getValue(); + let targetedAdvertisingOptOut: number = this.fields.get(UsDeField.TARGETED_ADVERTISING_OPT_OUT).getValue(); + let mspaServiceProviderMode: number = this.fields.get(UsDeField.MSPA_SERVICE_PROVIDER_MODE).getValue(); + let mspaOptOutOptionMode: number = this.fields.get(UsDeField.MSPA_OPT_OUT_OPTION_MODE).getValue(); + + if (saleOptOutNotice == 0) { + if (saleOptOut == 1 || saleOptOut == 2) { + throw new ValidationError( + "Invalid usde sale notice / opt out combination: {" + saleOptOutNotice + " / " + saleOptOut + "}" + ); + } + } else if (saleOptOutNotice == 1) { + if (saleOptOut == 0) { + throw new ValidationError( + "Invalid usde sale notice / opt out combination: {" + saleOptOutNotice + " / " + saleOptOut + "}" + ); + } + } else if (saleOptOutNotice == 2) { + if (saleOptOut == 0 || saleOptOut == 2) { + throw new ValidationError( + "Invalid usde sale notice / opt out combination: {" + saleOptOutNotice + " / " + saleOptOut + "}" + ); + } + } + + if (targetedAdvertisingOptOutNotice == 0) { + if (targetedAdvertisingOptOut == 1 || targetedAdvertisingOptOut == 2) { + throw new ValidationError( + "Invalid usde targeted advertising notice / opt out combination: {" + + targetedAdvertisingOptOutNotice + + " / " + + targetedAdvertisingOptOut + + "}" + ); + } + } else if (targetedAdvertisingOptOutNotice == 1) { + if (targetedAdvertisingOptOut == 0) { + throw new ValidationError( + "Invalid usde targeted advertising notice / opt out combination: {" + + targetedAdvertisingOptOutNotice + + " / " + + targetedAdvertisingOptOut + + "}" + ); + } + } else if (targetedAdvertisingOptOutNotice == 2) { + if (targetedAdvertisingOptOut == 0 || targetedAdvertisingOptOut == 2) { + throw new ValidationError( + "Invalid usde targeted advertising notice / opt out combination: {" + + targetedAdvertisingOptOutNotice + + " / " + + targetedAdvertisingOptOut + + "}" + ); + } + } + + if (mspaServiceProviderMode == 0) { + if (saleOptOutNotice == 1 || saleOptOutNotice == 2) { + throw new ValidationError( + "Invalid usde mspa service provider mode / sale opt out notice combination: {" + + mspaServiceProviderMode + + " / " + + saleOptOutNotice + + "}" + ); + } + } else if (mspaServiceProviderMode == 1) { + if (mspaOptOutOptionMode == 0 || mspaOptOutOptionMode == 1) { + throw new ValidationError( + "Invalid usde mspa service provider / opt out option modes combination: {" + + mspaServiceProviderMode + + " / " + + mspaServiceProviderMode + + "}" + ); + } + + if (saleOptOutNotice == 1 || saleOptOutNotice == 2) { + throw new ValidationError( + "Invalid usde mspa service provider mode / sale opt out notice combination: {" + + mspaServiceProviderMode + + " / " + + saleOptOutNotice + + "}" + ); + } + } else if (mspaServiceProviderMode == 2) { + if (mspaOptOutOptionMode == 0 || mspaOptOutOptionMode == 2) { + throw new ValidationError( + "Invalid usde mspa service provider / opt out option modes combination: {" + + mspaServiceProviderMode + + " / " + + mspaOptOutOptionMode + + "}" + ); + } + } + } +} diff --git a/modules/cmpapi/src/encoder/segment/UsDeGpcSegment.ts b/modules/cmpapi/src/encoder/segment/UsDeGpcSegment.ts new file mode 100644 index 0000000..fc09f9c --- /dev/null +++ b/modules/cmpapi/src/encoder/segment/UsDeGpcSegment.ts @@ -0,0 +1,56 @@ +import { AbstractBase64UrlEncoder } from "../base64/AbstractBase64UrlEncoder.js"; +import { CompressedBase64UrlEncoder } from "../base64/CompressedBase64UrlEncoder.js"; +import { BitStringEncoder } from "../bitstring/BitStringEncoder.js"; +import { EncodableBoolean } from "../datatype/EncodableBoolean.js"; +import { EncodableFixedInteger } from "../datatype/EncodableFixedInteger.js"; +import { DecodingError } from "../error/DecodingError.js"; +import { EncodableBitStringFields } from "../field/EncodableBitStringFields.js"; +import { USDE_GPC_SEGMENT_FIELD_NAMES } from "../field/UsDeField.js"; +import { UsDeField } from "../field/UsDeField.js"; +import { AbstractLazilyEncodableSegment } from "./AbstractLazilyEncodableSegment.js"; + +export class UsDeGpcSegment extends AbstractLazilyEncodableSegment { + private base64UrlEncoder: AbstractBase64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); + private bitStringEncoder: BitStringEncoder = BitStringEncoder.getInstance(); + + constructor(encodedString?: string) { + super(); + if (encodedString) { + this.decode(encodedString); + } + } + + // overriden + public getFieldNames(): string[] { + return USDE_GPC_SEGMENT_FIELD_NAMES; + } + + // overriden + protected initializeFields(): EncodableBitStringFields { + let fields: EncodableBitStringFields = new EncodableBitStringFields(); + fields.put(UsDeField.GPC_SEGMENT_TYPE.toString(), new EncodableFixedInteger(2, 1)); + fields.put(UsDeField.GPC_SEGMENT_INCLUDED.toString(), new EncodableBoolean(true)); + fields.put(UsDeField.GPC.toString(), new EncodableBoolean(false)); + return fields; + } + + // overriden + protected encodeSegment(fields: EncodableBitStringFields): string { + let bitString: string = this.bitStringEncoder.encode(fields, this.getFieldNames()); + let encodedString: string = this.base64UrlEncoder.encode(bitString); + return encodedString; + } + + // overriden + protected decodeSegment(encodedString: string, fields: EncodableBitStringFields): void { + if (encodedString == null || encodedString.length === 0) { + this.fields.reset(fields); + } + try { + let bitString: string = this.base64UrlEncoder.decode(encodedString); + this.bitStringEncoder.decode(bitString, this.getFieldNames(), fields); + } catch (e) { + throw new DecodingError("Unable to decode UsDeGpcSegment '" + encodedString + "'"); + } + } +} diff --git a/modules/cmpapi/src/encoder/segment/UsIaCoreSegment.ts b/modules/cmpapi/src/encoder/segment/UsIaCoreSegment.ts new file mode 100644 index 0000000..ee29676 --- /dev/null +++ b/modules/cmpapi/src/encoder/segment/UsIaCoreSegment.ts @@ -0,0 +1,232 @@ +import { AbstractBase64UrlEncoder } from "../base64/AbstractBase64UrlEncoder.js"; +import { CompressedBase64UrlEncoder } from "../base64/CompressedBase64UrlEncoder.js"; +import { BitStringEncoder } from "../bitstring/BitStringEncoder.js"; +import { EncodableFixedInteger } from "../datatype/EncodableFixedInteger.js"; +import { EncodableFixedIntegerList } from "../datatype/EncodableFixedIntegerList.js"; +import { Predicate } from "../datatype/validate/Predicate.js"; +import { DecodingError } from "../error/DecodingError.js"; +import { ValidationError } from "../error/ValidationError.js"; +import { EncodableBitStringFields } from "../field/EncodableBitStringFields.js"; +import { USIA_CORE_SEGMENT_FIELD_NAMES } from "../field/UsIaField.js"; +import { UsIaField } from "../field/UsIaField.js"; +import { UsIa } from "../section/UsIa.js"; +import { AbstractLazilyEncodableSegment } from "./AbstractLazilyEncodableSegment.js"; + +export class UsIaCoreSegment extends AbstractLazilyEncodableSegment { + private base64UrlEncoder: AbstractBase64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); + private bitStringEncoder: BitStringEncoder = BitStringEncoder.getInstance(); + + constructor(encodedString?: string) { + super(); + if (encodedString) { + this.decode(encodedString); + } + } + + // overriden + public getFieldNames(): string[] { + return USIA_CORE_SEGMENT_FIELD_NAMES; + } + + // overriden + protected initializeFields(): EncodableBitStringFields { + const nullableBooleanAsTwoBitIntegerValidator = new (class implements Predicate { + test(n: number): boolean { + return n >= 0 && n <= 2; + } + })(); + + const nonNullableBooleanAsTwoBitIntegerValidator = new (class implements Predicate { + test(n: number): boolean { + return n >= 1 && n <= 2; + } + })(); + const nullableBooleanAsTwoBitIntegerListValidator = new (class implements Predicate { + test(l: number[]): boolean { + for (let i = 0; i < l.length; i++) { + let n = l[i]; + if (n < 0 || n > 2) { + return false; + } + } + return true; + } + })(); + + let fields: EncodableBitStringFields = new EncodableBitStringFields(); + fields.put(UsIaField.VERSION.toString(), new EncodableFixedInteger(6, UsIa.VERSION)); + fields.put( + UsIaField.PROCESSING_NOTICE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsIaField.SALE_OPT_OUT_NOTICE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsIaField.SENSITIVE_DATA_OPT_OUT_NOTICE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsIaField.SALE_OPT_OUT.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsIaField.TARGETED_ADVERTISING_OPT_OUT.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsIaField.SENSITIVE_DATA_PROCESSING.toString(), + new EncodableFixedIntegerList(2, [0, 0, 0, 0, 0, 0, 0, 0]).withValidator( + nullableBooleanAsTwoBitIntegerListValidator + ) + ); + fields.put( + UsIaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsIaField.MSPA_COVERED_TRANSACTION.toString(), + new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsIaField.MSPA_OPT_OUT_OPTION_MODE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsIaField.MSPA_SERVICE_PROVIDER_MODE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + return fields; + } + + // overriden + protected encodeSegment(fields: EncodableBitStringFields): string { + let bitString: string = this.bitStringEncoder.encode(fields, this.getFieldNames()); + let encodedString: string = this.base64UrlEncoder.encode(bitString); + return encodedString; + } + + // overriden + protected decodeSegment(encodedString: string, fields: EncodableBitStringFields): void { + if (encodedString == null || encodedString.length === 0) { + this.fields.reset(fields); + } + try { + let bitString: string = this.base64UrlEncoder.decode(encodedString); + this.bitStringEncoder.decode(bitString, this.getFieldNames(), fields); + } catch (e) { + throw new DecodingError("Unable to decode UsIaCoreSegment '" + encodedString + "'"); + } + } + + // overriden + public validate(): void { + let saleOptOutNotice: number = this.fields.get(UsIaField.SALE_OPT_OUT_NOTICE).getValue(); + let saleOptOut: number = this.fields.get(UsIaField.SALE_OPT_OUT).getValue(); + let targetedAdvertisingOptOutNotice: number = this.fields + .get(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE) + .getValue(); + let targetedAdvertisingOptOut: number = this.fields.get(UsIaField.TARGETED_ADVERTISING_OPT_OUT).getValue(); + let mspaServiceProviderMode: number = this.fields.get(UsIaField.MSPA_SERVICE_PROVIDER_MODE).getValue(); + let mspaOptOutOptionMode: number = this.fields.get(UsIaField.MSPA_OPT_OUT_OPTION_MODE).getValue(); + + if (saleOptOutNotice == 0) { + if (saleOptOut == 1 || saleOptOut == 2) { + throw new ValidationError( + "Invalid usia sale notice / opt out combination: {" + saleOptOutNotice + " / " + saleOptOut + "}" + ); + } + } else if (saleOptOutNotice == 1) { + if (saleOptOut == 0) { + throw new ValidationError( + "Invalid usia sale notice / opt out combination: {" + saleOptOutNotice + " / " + saleOptOut + "}" + ); + } + } else if (saleOptOutNotice == 2) { + if (saleOptOut == 0 || saleOptOut == 2) { + throw new ValidationError( + "Invalid usia sale notice / opt out combination: {" + saleOptOutNotice + " / " + saleOptOut + "}" + ); + } + } + + if (targetedAdvertisingOptOutNotice == 0) { + if (targetedAdvertisingOptOut == 1 || targetedAdvertisingOptOut == 2) { + throw new ValidationError( + "Invalid usia targeted advertising notice / opt out combination: {" + + targetedAdvertisingOptOutNotice + + " / " + + targetedAdvertisingOptOut + + "}" + ); + } + } else if (targetedAdvertisingOptOutNotice == 1) { + if (targetedAdvertisingOptOut == 0) { + throw new ValidationError( + "Invalid usia targeted advertising notice / opt out combination: {" + + targetedAdvertisingOptOutNotice + + " / " + + targetedAdvertisingOptOut + + "}" + ); + } + } else if (targetedAdvertisingOptOutNotice == 2) { + if (targetedAdvertisingOptOut == 0 || targetedAdvertisingOptOut == 2) { + throw new ValidationError( + "Invalid usia targeted advertising notice / opt out combination: {" + + targetedAdvertisingOptOutNotice + + " / " + + targetedAdvertisingOptOut + + "}" + ); + } + } + + if (mspaServiceProviderMode == 0) { + if (saleOptOutNotice == 1 || saleOptOutNotice == 2) { + throw new ValidationError( + "Invalid usia mspa service provider mode / sale opt out notice combination: {" + + mspaServiceProviderMode + + " / " + + saleOptOutNotice + + "}" + ); + } + } else if (mspaServiceProviderMode == 1) { + if (mspaOptOutOptionMode == 0 || mspaOptOutOptionMode == 1) { + throw new ValidationError( + "Invalid usia mspa service provider / opt out option modes combination: {" + + mspaServiceProviderMode + + " / " + + mspaServiceProviderMode + + "}" + ); + } + + if (saleOptOutNotice == 1 || saleOptOutNotice == 2) { + throw new ValidationError( + "Invalid usia mspa service provider mode / sale opt out notice combination: {" + + mspaServiceProviderMode + + " / " + + saleOptOutNotice + + "}" + ); + } + } else if (mspaServiceProviderMode == 2) { + if (mspaOptOutOptionMode == 0 || mspaOptOutOptionMode == 2) { + throw new ValidationError( + "Invalid usia mspa service provider / opt out option modes combination: {" + + mspaServiceProviderMode + + " / " + + mspaOptOutOptionMode + + "}" + ); + } + } + } +} diff --git a/modules/cmpapi/src/encoder/segment/UsIaGpcSegment.ts b/modules/cmpapi/src/encoder/segment/UsIaGpcSegment.ts new file mode 100644 index 0000000..88dbca2 --- /dev/null +++ b/modules/cmpapi/src/encoder/segment/UsIaGpcSegment.ts @@ -0,0 +1,56 @@ +import { AbstractBase64UrlEncoder } from "../base64/AbstractBase64UrlEncoder.js"; +import { CompressedBase64UrlEncoder } from "../base64/CompressedBase64UrlEncoder.js"; +import { BitStringEncoder } from "../bitstring/BitStringEncoder.js"; +import { EncodableBoolean } from "../datatype/EncodableBoolean.js"; +import { EncodableFixedInteger } from "../datatype/EncodableFixedInteger.js"; +import { DecodingError } from "../error/DecodingError.js"; +import { EncodableBitStringFields } from "../field/EncodableBitStringFields.js"; +import { USIA_GPC_SEGMENT_FIELD_NAMES } from "../field/UsIaField.js"; +import { UsIaField } from "../field/UsIaField.js"; +import { AbstractLazilyEncodableSegment } from "./AbstractLazilyEncodableSegment.js"; + +export class UsIaGpcSegment extends AbstractLazilyEncodableSegment { + private base64UrlEncoder: AbstractBase64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); + private bitStringEncoder: BitStringEncoder = BitStringEncoder.getInstance(); + + constructor(encodedString?: string) { + super(); + if (encodedString) { + this.decode(encodedString); + } + } + + // overriden + public getFieldNames(): string[] { + return USIA_GPC_SEGMENT_FIELD_NAMES; + } + + // overriden + protected initializeFields(): EncodableBitStringFields { + let fields: EncodableBitStringFields = new EncodableBitStringFields(); + fields.put(UsIaField.GPC_SEGMENT_TYPE.toString(), new EncodableFixedInteger(2, 1)); + fields.put(UsIaField.GPC_SEGMENT_INCLUDED.toString(), new EncodableBoolean(true)); + fields.put(UsIaField.GPC.toString(), new EncodableBoolean(false)); + return fields; + } + + // overriden + protected encodeSegment(fields: EncodableBitStringFields): string { + let bitString: string = this.bitStringEncoder.encode(fields, this.getFieldNames()); + let encodedString: string = this.base64UrlEncoder.encode(bitString); + return encodedString; + } + + // overriden + protected decodeSegment(encodedString: string, fields: EncodableBitStringFields): void { + if (encodedString == null || encodedString.length === 0) { + this.fields.reset(fields); + } + try { + let bitString: string = this.base64UrlEncoder.decode(encodedString); + this.bitStringEncoder.decode(bitString, this.getFieldNames(), fields); + } catch (e) { + throw new DecodingError("Unable to decode UsIaGpcSegment '" + encodedString + "'"); + } + } +} diff --git a/modules/cmpapi/src/encoder/segment/UsNatCoreSegment.ts b/modules/cmpapi/src/encoder/segment/UsNatCoreSegment.ts index 6ddef04..c63b4d7 100644 --- a/modules/cmpapi/src/encoder/segment/UsNatCoreSegment.ts +++ b/modules/cmpapi/src/encoder/segment/UsNatCoreSegment.ts @@ -93,13 +93,13 @@ export class UsNatCoreSegment extends AbstractLazilyEncodableSegment { + private base64UrlEncoder: AbstractBase64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); + private bitStringEncoder: BitStringEncoder = BitStringEncoder.getInstance(); + + constructor(encodedString?: string) { + super(); + if (encodedString) { + this.decode(encodedString); + } + } + + // overriden + public getFieldNames(): string[] { + return USNE_CORE_SEGMENT_FIELD_NAMES; + } + + // overriden + protected initializeFields(): EncodableBitStringFields { + const nullableBooleanAsTwoBitIntegerValidator = new (class implements Predicate { + test(n: number): boolean { + return n >= 0 && n <= 2; + } + })(); + + const nonNullableBooleanAsTwoBitIntegerValidator = new (class implements Predicate { + test(n: number): boolean { + return n >= 1 && n <= 2; + } + })(); + const nullableBooleanAsTwoBitIntegerListValidator = new (class implements Predicate { + test(l: number[]): boolean { + for (let i = 0; i < l.length; i++) { + let n = l[i]; + if (n < 0 || n > 2) { + return false; + } + } + return true; + } + })(); + + let fields: EncodableBitStringFields = new EncodableBitStringFields(); + fields.put(UsNeField.VERSION.toString(), new EncodableFixedInteger(6, UsNe.VERSION)); + fields.put( + UsNeField.PROCESSING_NOTICE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsNeField.SALE_OPT_OUT_NOTICE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsNeField.SALE_OPT_OUT.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsNeField.TARGETED_ADVERTISING_OPT_OUT.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsNeField.SENSITIVE_DATA_PROCESSING.toString(), + new EncodableFixedIntegerList(2, [0, 0, 0, 0, 0, 0, 0, 0]).withValidator( + nullableBooleanAsTwoBitIntegerListValidator + ) + ); + fields.put( + UsNeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsNeField.ADDITIONAL_DATA_PROCESSING_CONSENT.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsNeField.MSPA_COVERED_TRANSACTION.toString(), + new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsNeField.MSPA_OPT_OUT_OPTION_MODE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsNeField.MSPA_SERVICE_PROVIDER_MODE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + return fields; + } + + // overriden + protected encodeSegment(fields: EncodableBitStringFields): string { + let bitString: string = this.bitStringEncoder.encode(fields, this.getFieldNames()); + let encodedString: string = this.base64UrlEncoder.encode(bitString); + return encodedString; + } + + // overriden + protected decodeSegment(encodedString: string, fields: EncodableBitStringFields): void { + if (encodedString == null || encodedString.length === 0) { + this.fields.reset(fields); + } + try { + let bitString: string = this.base64UrlEncoder.decode(encodedString); + this.bitStringEncoder.decode(bitString, this.getFieldNames(), fields); + } catch (e) { + throw new DecodingError("Unable to decode UsNeCoreSegment '" + encodedString + "'"); + } + } + + // overriden + public validate(): void { + let saleOptOutNotice: number = this.fields.get(UsNeField.SALE_OPT_OUT_NOTICE).getValue(); + let saleOptOut: number = this.fields.get(UsNeField.SALE_OPT_OUT).getValue(); + let targetedAdvertisingOptOutNotice: number = this.fields + .get(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE) + .getValue(); + let targetedAdvertisingOptOut: number = this.fields.get(UsNeField.TARGETED_ADVERTISING_OPT_OUT).getValue(); + let mspaServiceProviderMode: number = this.fields.get(UsNeField.MSPA_SERVICE_PROVIDER_MODE).getValue(); + let mspaOptOutOptionMode: number = this.fields.get(UsNeField.MSPA_OPT_OUT_OPTION_MODE).getValue(); + + if (saleOptOutNotice == 0) { + if (saleOptOut == 1 || saleOptOut == 2) { + throw new ValidationError( + "Invalid usne sale notice / opt out combination: {" + saleOptOutNotice + " / " + saleOptOut + "}" + ); + } + } else if (saleOptOutNotice == 1) { + if (saleOptOut == 0) { + throw new ValidationError( + "Invalid usne sale notice / opt out combination: {" + saleOptOutNotice + " / " + saleOptOut + "}" + ); + } + } else if (saleOptOutNotice == 2) { + if (saleOptOut == 0 || saleOptOut == 2) { + throw new ValidationError( + "Invalid usne sale notice / opt out combination: {" + saleOptOutNotice + " / " + saleOptOut + "}" + ); + } + } + + if (targetedAdvertisingOptOutNotice == 0) { + if (targetedAdvertisingOptOut == 1 || targetedAdvertisingOptOut == 2) { + throw new ValidationError( + "Invalid usne targeted advertising notice / opt out combination: {" + + targetedAdvertisingOptOutNotice + + " / " + + targetedAdvertisingOptOut + + "}" + ); + } + } else if (targetedAdvertisingOptOutNotice == 1) { + if (targetedAdvertisingOptOut == 0) { + throw new ValidationError( + "Invalid usne targeted advertising notice / opt out combination: {" + + targetedAdvertisingOptOutNotice + + " / " + + targetedAdvertisingOptOut + + "}" + ); + } + } else if (targetedAdvertisingOptOutNotice == 2) { + if (targetedAdvertisingOptOut == 0 || targetedAdvertisingOptOut == 2) { + throw new ValidationError( + "Invalid usne targeted advertising notice / opt out combination: {" + + targetedAdvertisingOptOutNotice + + " / " + + targetedAdvertisingOptOut + + "}" + ); + } + } + + if (mspaServiceProviderMode == 0) { + if (saleOptOutNotice == 1 || saleOptOutNotice == 2) { + throw new ValidationError( + "Invalid usne mspa service provider mode / sale opt out notice combination: {" + + mspaServiceProviderMode + + " / " + + saleOptOutNotice + + "}" + ); + } + } else if (mspaServiceProviderMode == 1) { + if (mspaOptOutOptionMode == 0 || mspaOptOutOptionMode == 1) { + throw new ValidationError( + "Invalid usne mspa service provider / opt out option modes combination: {" + + mspaServiceProviderMode + + " / " + + mspaServiceProviderMode + + "}" + ); + } + + if (saleOptOutNotice == 1 || saleOptOutNotice == 2) { + throw new ValidationError( + "Invalid usne mspa service provider mode / sale opt out notice combination: {" + + mspaServiceProviderMode + + " / " + + saleOptOutNotice + + "}" + ); + } + } else if (mspaServiceProviderMode == 2) { + if (mspaOptOutOptionMode == 0 || mspaOptOutOptionMode == 2) { + throw new ValidationError( + "Invalid usne mspa service provider / opt out option modes combination: {" + + mspaServiceProviderMode + + " / " + + mspaOptOutOptionMode + + "}" + ); + } + } + } +} diff --git a/modules/cmpapi/src/encoder/segment/UsNeGpcSegment.ts b/modules/cmpapi/src/encoder/segment/UsNeGpcSegment.ts new file mode 100644 index 0000000..7cb0c52 --- /dev/null +++ b/modules/cmpapi/src/encoder/segment/UsNeGpcSegment.ts @@ -0,0 +1,56 @@ +import { AbstractBase64UrlEncoder } from "../base64/AbstractBase64UrlEncoder.js"; +import { CompressedBase64UrlEncoder } from "../base64/CompressedBase64UrlEncoder.js"; +import { BitStringEncoder } from "../bitstring/BitStringEncoder.js"; +import { EncodableBoolean } from "../datatype/EncodableBoolean.js"; +import { EncodableFixedInteger } from "../datatype/EncodableFixedInteger.js"; +import { DecodingError } from "../error/DecodingError.js"; +import { EncodableBitStringFields } from "../field/EncodableBitStringFields.js"; +import { USNE_GPC_SEGMENT_FIELD_NAMES } from "../field/UsNeField.js"; +import { UsNeField } from "../field/UsNeField.js"; +import { AbstractLazilyEncodableSegment } from "./AbstractLazilyEncodableSegment.js"; + +export class UsNeGpcSegment extends AbstractLazilyEncodableSegment { + private base64UrlEncoder: AbstractBase64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); + private bitStringEncoder: BitStringEncoder = BitStringEncoder.getInstance(); + + constructor(encodedString?: string) { + super(); + if (encodedString) { + this.decode(encodedString); + } + } + + // overriden + public getFieldNames(): string[] { + return USNE_GPC_SEGMENT_FIELD_NAMES; + } + + // overriden + protected initializeFields(): EncodableBitStringFields { + let fields: EncodableBitStringFields = new EncodableBitStringFields(); + fields.put(UsNeField.GPC_SEGMENT_TYPE.toString(), new EncodableFixedInteger(2, 1)); + fields.put(UsNeField.GPC_SEGMENT_INCLUDED.toString(), new EncodableBoolean(true)); + fields.put(UsNeField.GPC.toString(), new EncodableBoolean(false)); + return fields; + } + + // overriden + protected encodeSegment(fields: EncodableBitStringFields): string { + let bitString: string = this.bitStringEncoder.encode(fields, this.getFieldNames()); + let encodedString: string = this.base64UrlEncoder.encode(bitString); + return encodedString; + } + + // overriden + protected decodeSegment(encodedString: string, fields: EncodableBitStringFields): void { + if (encodedString == null || encodedString.length === 0) { + this.fields.reset(fields); + } + try { + let bitString: string = this.base64UrlEncoder.decode(encodedString); + this.bitStringEncoder.decode(bitString, this.getFieldNames(), fields); + } catch (e) { + throw new DecodingError("Unable to decode UsNeGpcSegment '" + encodedString + "'"); + } + } +} diff --git a/modules/cmpapi/src/encoder/segment/UsNhCoreSegment.ts b/modules/cmpapi/src/encoder/segment/UsNhCoreSegment.ts new file mode 100644 index 0000000..a422ea9 --- /dev/null +++ b/modules/cmpapi/src/encoder/segment/UsNhCoreSegment.ts @@ -0,0 +1,232 @@ +import { AbstractBase64UrlEncoder } from "../base64/AbstractBase64UrlEncoder.js"; +import { CompressedBase64UrlEncoder } from "../base64/CompressedBase64UrlEncoder.js"; +import { BitStringEncoder } from "../bitstring/BitStringEncoder.js"; +import { EncodableFixedInteger } from "../datatype/EncodableFixedInteger.js"; +import { EncodableFixedIntegerList } from "../datatype/EncodableFixedIntegerList.js"; +import { Predicate } from "../datatype/validate/Predicate.js"; +import { DecodingError } from "../error/DecodingError.js"; +import { ValidationError } from "../error/ValidationError.js"; +import { EncodableBitStringFields } from "../field/EncodableBitStringFields.js"; +import { USNH_CORE_SEGMENT_FIELD_NAMES } from "../field/UsNhField.js"; +import { UsNhField } from "../field/UsNhField.js"; +import { UsNh } from "../section/UsNh.js"; +import { AbstractLazilyEncodableSegment } from "./AbstractLazilyEncodableSegment.js"; + +export class UsNhCoreSegment extends AbstractLazilyEncodableSegment { + private base64UrlEncoder: AbstractBase64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); + private bitStringEncoder: BitStringEncoder = BitStringEncoder.getInstance(); + + constructor(encodedString?: string) { + super(); + if (encodedString) { + this.decode(encodedString); + } + } + + // overriden + public getFieldNames(): string[] { + return USNH_CORE_SEGMENT_FIELD_NAMES; + } + + // overriden + protected initializeFields(): EncodableBitStringFields { + const nullableBooleanAsTwoBitIntegerValidator = new (class implements Predicate { + test(n: number): boolean { + return n >= 0 && n <= 2; + } + })(); + + const nonNullableBooleanAsTwoBitIntegerValidator = new (class implements Predicate { + test(n: number): boolean { + return n >= 1 && n <= 2; + } + })(); + const nullableBooleanAsTwoBitIntegerListValidator = new (class implements Predicate { + test(l: number[]): boolean { + for (let i = 0; i < l.length; i++) { + let n = l[i]; + if (n < 0 || n > 2) { + return false; + } + } + return true; + } + })(); + + let fields: EncodableBitStringFields = new EncodableBitStringFields(); + fields.put(UsNhField.VERSION.toString(), new EncodableFixedInteger(6, UsNh.VERSION)); + fields.put( + UsNhField.PROCESSING_NOTICE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsNhField.SALE_OPT_OUT_NOTICE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsNhField.SALE_OPT_OUT.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsNhField.TARGETED_ADVERTISING_OPT_OUT.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsNhField.SENSITIVE_DATA_PROCESSING.toString(), + new EncodableFixedIntegerList(2, [0, 0, 0, 0, 0, 0, 0, 0]).withValidator( + nullableBooleanAsTwoBitIntegerListValidator + ) + ); + fields.put( + UsNhField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS.toString(), + new EncodableFixedIntegerList(2, [0, 0, 0]).withValidator(nullableBooleanAsTwoBitIntegerListValidator) + ); + fields.put( + UsNhField.ADDITIONAL_DATA_PROCESSING_CONSENT.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsNhField.MSPA_COVERED_TRANSACTION.toString(), + new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsNhField.MSPA_OPT_OUT_OPTION_MODE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsNhField.MSPA_SERVICE_PROVIDER_MODE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + return fields; + } + + // overriden + protected encodeSegment(fields: EncodableBitStringFields): string { + let bitString: string = this.bitStringEncoder.encode(fields, this.getFieldNames()); + let encodedString: string = this.base64UrlEncoder.encode(bitString); + return encodedString; + } + + // overriden + protected decodeSegment(encodedString: string, fields: EncodableBitStringFields): void { + if (encodedString == null || encodedString.length === 0) { + this.fields.reset(fields); + } + try { + let bitString: string = this.base64UrlEncoder.decode(encodedString); + this.bitStringEncoder.decode(bitString, this.getFieldNames(), fields); + } catch (e) { + throw new DecodingError("Unable to decode UsNhCoreSegment '" + encodedString + "'"); + } + } + + // overriden + public validate(): void { + let saleOptOutNotice: number = this.fields.get(UsNhField.SALE_OPT_OUT_NOTICE).getValue(); + let saleOptOut: number = this.fields.get(UsNhField.SALE_OPT_OUT).getValue(); + let targetedAdvertisingOptOutNotice: number = this.fields + .get(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE) + .getValue(); + let targetedAdvertisingOptOut: number = this.fields.get(UsNhField.TARGETED_ADVERTISING_OPT_OUT).getValue(); + let mspaServiceProviderMode: number = this.fields.get(UsNhField.MSPA_SERVICE_PROVIDER_MODE).getValue(); + let mspaOptOutOptionMode: number = this.fields.get(UsNhField.MSPA_OPT_OUT_OPTION_MODE).getValue(); + + if (saleOptOutNotice == 0) { + if (saleOptOut == 1 || saleOptOut == 2) { + throw new ValidationError( + "Invalid usnh sale notice / opt out combination: {" + saleOptOutNotice + " / " + saleOptOut + "}" + ); + } + } else if (saleOptOutNotice == 1) { + if (saleOptOut == 0) { + throw new ValidationError( + "Invalid usnh sale notice / opt out combination: {" + saleOptOutNotice + " / " + saleOptOut + "}" + ); + } + } else if (saleOptOutNotice == 2) { + if (saleOptOut == 0 || saleOptOut == 2) { + throw new ValidationError( + "Invalid usnh sale notice / opt out combination: {" + saleOptOutNotice + " / " + saleOptOut + "}" + ); + } + } + + if (targetedAdvertisingOptOutNotice == 0) { + if (targetedAdvertisingOptOut == 1 || targetedAdvertisingOptOut == 2) { + throw new ValidationError( + "Invalid usnh targeted advertising notice / opt out combination: {" + + targetedAdvertisingOptOutNotice + + " / " + + targetedAdvertisingOptOut + + "}" + ); + } + } else if (targetedAdvertisingOptOutNotice == 1) { + if (targetedAdvertisingOptOut == 0) { + throw new ValidationError( + "Invalid usnh targeted advertising notice / opt out combination: {" + + targetedAdvertisingOptOutNotice + + " / " + + targetedAdvertisingOptOut + + "}" + ); + } + } else if (targetedAdvertisingOptOutNotice == 2) { + if (targetedAdvertisingOptOut == 0 || targetedAdvertisingOptOut == 2) { + throw new ValidationError( + "Invalid usnh targeted advertising notice / opt out combination: {" + + targetedAdvertisingOptOutNotice + + " / " + + targetedAdvertisingOptOut + + "}" + ); + } + } + + if (mspaServiceProviderMode == 0) { + if (saleOptOutNotice == 1 || saleOptOutNotice == 2) { + throw new ValidationError( + "Invalid usnh mspa service provider mode / sale opt out notice combination: {" + + mspaServiceProviderMode + + " / " + + saleOptOutNotice + + "}" + ); + } + } else if (mspaServiceProviderMode == 1) { + if (mspaOptOutOptionMode == 0 || mspaOptOutOptionMode == 1) { + throw new ValidationError( + "Invalid usnh mspa service provider / opt out option modes combination: {" + + mspaServiceProviderMode + + " / " + + mspaServiceProviderMode + + "}" + ); + } + + if (saleOptOutNotice == 1 || saleOptOutNotice == 2) { + throw new ValidationError( + "Invalid usnh mspa service provider mode / sale opt out notice combination: {" + + mspaServiceProviderMode + + " / " + + saleOptOutNotice + + "}" + ); + } + } else if (mspaServiceProviderMode == 2) { + if (mspaOptOutOptionMode == 0 || mspaOptOutOptionMode == 2) { + throw new ValidationError( + "Invalid usnh mspa service provider / opt out option modes combination: {" + + mspaServiceProviderMode + + " / " + + mspaOptOutOptionMode + + "}" + ); + } + } + } +} diff --git a/modules/cmpapi/src/encoder/segment/UsNhGpcSegment.ts b/modules/cmpapi/src/encoder/segment/UsNhGpcSegment.ts new file mode 100644 index 0000000..aa93aa8 --- /dev/null +++ b/modules/cmpapi/src/encoder/segment/UsNhGpcSegment.ts @@ -0,0 +1,56 @@ +import { AbstractBase64UrlEncoder } from "../base64/AbstractBase64UrlEncoder.js"; +import { CompressedBase64UrlEncoder } from "../base64/CompressedBase64UrlEncoder.js"; +import { BitStringEncoder } from "../bitstring/BitStringEncoder.js"; +import { EncodableBoolean } from "../datatype/EncodableBoolean.js"; +import { EncodableFixedInteger } from "../datatype/EncodableFixedInteger.js"; +import { DecodingError } from "../error/DecodingError.js"; +import { EncodableBitStringFields } from "../field/EncodableBitStringFields.js"; +import { USNH_GPC_SEGMENT_FIELD_NAMES } from "../field/UsNhField.js"; +import { UsNhField } from "../field/UsNhField.js"; +import { AbstractLazilyEncodableSegment } from "./AbstractLazilyEncodableSegment.js"; + +export class UsNhGpcSegment extends AbstractLazilyEncodableSegment { + private base64UrlEncoder: AbstractBase64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); + private bitStringEncoder: BitStringEncoder = BitStringEncoder.getInstance(); + + constructor(encodedString?: string) { + super(); + if (encodedString) { + this.decode(encodedString); + } + } + + // overriden + public getFieldNames(): string[] { + return USNH_GPC_SEGMENT_FIELD_NAMES; + } + + // overriden + protected initializeFields(): EncodableBitStringFields { + let fields: EncodableBitStringFields = new EncodableBitStringFields(); + fields.put(UsNhField.GPC_SEGMENT_TYPE.toString(), new EncodableFixedInteger(2, 1)); + fields.put(UsNhField.GPC_SEGMENT_INCLUDED.toString(), new EncodableBoolean(true)); + fields.put(UsNhField.GPC.toString(), new EncodableBoolean(false)); + return fields; + } + + // overriden + protected encodeSegment(fields: EncodableBitStringFields): string { + let bitString: string = this.bitStringEncoder.encode(fields, this.getFieldNames()); + let encodedString: string = this.base64UrlEncoder.encode(bitString); + return encodedString; + } + + // overriden + protected decodeSegment(encodedString: string, fields: EncodableBitStringFields): void { + if (encodedString == null || encodedString.length === 0) { + this.fields.reset(fields); + } + try { + let bitString: string = this.base64UrlEncoder.decode(encodedString); + this.bitStringEncoder.decode(bitString, this.getFieldNames(), fields); + } catch (e) { + throw new DecodingError("Unable to decode UsNhGpcSegment '" + encodedString + "'"); + } + } +} diff --git a/modules/cmpapi/src/encoder/segment/UsNjCoreSegment.ts b/modules/cmpapi/src/encoder/segment/UsNjCoreSegment.ts new file mode 100644 index 0000000..cc98490 --- /dev/null +++ b/modules/cmpapi/src/encoder/segment/UsNjCoreSegment.ts @@ -0,0 +1,232 @@ +import { AbstractBase64UrlEncoder } from "../base64/AbstractBase64UrlEncoder.js"; +import { CompressedBase64UrlEncoder } from "../base64/CompressedBase64UrlEncoder.js"; +import { BitStringEncoder } from "../bitstring/BitStringEncoder.js"; +import { EncodableFixedInteger } from "../datatype/EncodableFixedInteger.js"; +import { EncodableFixedIntegerList } from "../datatype/EncodableFixedIntegerList.js"; +import { Predicate } from "../datatype/validate/Predicate.js"; +import { DecodingError } from "../error/DecodingError.js"; +import { ValidationError } from "../error/ValidationError.js"; +import { EncodableBitStringFields } from "../field/EncodableBitStringFields.js"; +import { USNJ_CORE_SEGMENT_FIELD_NAMES } from "../field/UsNjField.js"; +import { UsNjField } from "../field/UsNjField.js"; +import { UsNj } from "../section/UsNj.js"; +import { AbstractLazilyEncodableSegment } from "./AbstractLazilyEncodableSegment.js"; + +export class UsNjCoreSegment extends AbstractLazilyEncodableSegment { + private base64UrlEncoder: AbstractBase64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); + private bitStringEncoder: BitStringEncoder = BitStringEncoder.getInstance(); + + constructor(encodedString?: string) { + super(); + if (encodedString) { + this.decode(encodedString); + } + } + + // overriden + public getFieldNames(): string[] { + return USNJ_CORE_SEGMENT_FIELD_NAMES; + } + + // overriden + protected initializeFields(): EncodableBitStringFields { + const nullableBooleanAsTwoBitIntegerValidator = new (class implements Predicate { + test(n: number): boolean { + return n >= 0 && n <= 2; + } + })(); + + const nonNullableBooleanAsTwoBitIntegerValidator = new (class implements Predicate { + test(n: number): boolean { + return n >= 1 && n <= 2; + } + })(); + const nullableBooleanAsTwoBitIntegerListValidator = new (class implements Predicate { + test(l: number[]): boolean { + for (let i = 0; i < l.length; i++) { + let n = l[i]; + if (n < 0 || n > 2) { + return false; + } + } + return true; + } + })(); + + let fields: EncodableBitStringFields = new EncodableBitStringFields(); + fields.put(UsNjField.VERSION.toString(), new EncodableFixedInteger(6, UsNj.VERSION)); + fields.put( + UsNjField.PROCESSING_NOTICE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsNjField.SALE_OPT_OUT_NOTICE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsNjField.SALE_OPT_OUT.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsNjField.TARGETED_ADVERTISING_OPT_OUT.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsNjField.SENSITIVE_DATA_PROCESSING.toString(), + new EncodableFixedIntegerList(2, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]).withValidator( + nullableBooleanAsTwoBitIntegerListValidator + ) + ); + fields.put( + UsNjField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS.toString(), + new EncodableFixedIntegerList(2, [0, 0, 0, 0, 0]).withValidator(nullableBooleanAsTwoBitIntegerListValidator) + ); + fields.put( + UsNjField.ADDITIONAL_DATA_PROCESSING_CONSENT.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsNjField.MSPA_COVERED_TRANSACTION.toString(), + new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsNjField.MSPA_OPT_OUT_OPTION_MODE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsNjField.MSPA_SERVICE_PROVIDER_MODE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + return fields; + } + + // overriden + protected encodeSegment(fields: EncodableBitStringFields): string { + let bitString: string = this.bitStringEncoder.encode(fields, this.getFieldNames()); + let encodedString: string = this.base64UrlEncoder.encode(bitString); + return encodedString; + } + + // overriden + protected decodeSegment(encodedString: string, fields: EncodableBitStringFields): void { + if (encodedString == null || encodedString.length === 0) { + this.fields.reset(fields); + } + try { + let bitString: string = this.base64UrlEncoder.decode(encodedString); + this.bitStringEncoder.decode(bitString, this.getFieldNames(), fields); + } catch (e) { + throw new DecodingError("Unable to decode UsNjCoreSegment '" + encodedString + "'"); + } + } + + // overriden + public validate(): void { + let saleOptOutNotice: number = this.fields.get(UsNjField.SALE_OPT_OUT_NOTICE).getValue(); + let saleOptOut: number = this.fields.get(UsNjField.SALE_OPT_OUT).getValue(); + let targetedAdvertisingOptOutNotice: number = this.fields + .get(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE) + .getValue(); + let targetedAdvertisingOptOut: number = this.fields.get(UsNjField.TARGETED_ADVERTISING_OPT_OUT).getValue(); + let mspaServiceProviderMode: number = this.fields.get(UsNjField.MSPA_SERVICE_PROVIDER_MODE).getValue(); + let mspaOptOutOptionMode: number = this.fields.get(UsNjField.MSPA_OPT_OUT_OPTION_MODE).getValue(); + + if (saleOptOutNotice == 0) { + if (saleOptOut == 1 || saleOptOut == 2) { + throw new ValidationError( + "Invalid usnj sale notice / opt out combination: {" + saleOptOutNotice + " / " + saleOptOut + "}" + ); + } + } else if (saleOptOutNotice == 1) { + if (saleOptOut == 0) { + throw new ValidationError( + "Invalid usnj sale notice / opt out combination: {" + saleOptOutNotice + " / " + saleOptOut + "}" + ); + } + } else if (saleOptOutNotice == 2) { + if (saleOptOut == 0 || saleOptOut == 2) { + throw new ValidationError( + "Invalid usnj sale notice / opt out combination: {" + saleOptOutNotice + " / " + saleOptOut + "}" + ); + } + } + + if (targetedAdvertisingOptOutNotice == 0) { + if (targetedAdvertisingOptOut == 1 || targetedAdvertisingOptOut == 2) { + throw new ValidationError( + "Invalid usnj targeted advertising notice / opt out combination: {" + + targetedAdvertisingOptOutNotice + + " / " + + targetedAdvertisingOptOut + + "}" + ); + } + } else if (targetedAdvertisingOptOutNotice == 1) { + if (targetedAdvertisingOptOut == 0) { + throw new ValidationError( + "Invalid usnj targeted advertising notice / opt out combination: {" + + targetedAdvertisingOptOutNotice + + " / " + + targetedAdvertisingOptOut + + "}" + ); + } + } else if (targetedAdvertisingOptOutNotice == 2) { + if (targetedAdvertisingOptOut == 0 || targetedAdvertisingOptOut == 2) { + throw new ValidationError( + "Invalid usnj targeted advertising notice / opt out combination: {" + + targetedAdvertisingOptOutNotice + + " / " + + targetedAdvertisingOptOut + + "}" + ); + } + } + + if (mspaServiceProviderMode == 0) { + if (saleOptOutNotice == 1 || saleOptOutNotice == 2) { + throw new ValidationError( + "Invalid usnj mspa service provider mode / sale opt out notice combination: {" + + mspaServiceProviderMode + + " / " + + saleOptOutNotice + + "}" + ); + } + } else if (mspaServiceProviderMode == 1) { + if (mspaOptOutOptionMode == 0 || mspaOptOutOptionMode == 1) { + throw new ValidationError( + "Invalid usnj mspa service provider / opt out option modes combination: {" + + mspaServiceProviderMode + + " / " + + mspaServiceProviderMode + + "}" + ); + } + + if (saleOptOutNotice == 1 || saleOptOutNotice == 2) { + throw new ValidationError( + "Invalid usnj mspa service provider mode / sale opt out notice combination: {" + + mspaServiceProviderMode + + " / " + + saleOptOutNotice + + "}" + ); + } + } else if (mspaServiceProviderMode == 2) { + if (mspaOptOutOptionMode == 0 || mspaOptOutOptionMode == 2) { + throw new ValidationError( + "Invalid usnj mspa service provider / opt out option modes combination: {" + + mspaServiceProviderMode + + " / " + + mspaOptOutOptionMode + + "}" + ); + } + } + } +} diff --git a/modules/cmpapi/src/encoder/segment/UsNjGpcSegment.ts b/modules/cmpapi/src/encoder/segment/UsNjGpcSegment.ts new file mode 100644 index 0000000..fdd26c7 --- /dev/null +++ b/modules/cmpapi/src/encoder/segment/UsNjGpcSegment.ts @@ -0,0 +1,56 @@ +import { AbstractBase64UrlEncoder } from "../base64/AbstractBase64UrlEncoder.js"; +import { CompressedBase64UrlEncoder } from "../base64/CompressedBase64UrlEncoder.js"; +import { BitStringEncoder } from "../bitstring/BitStringEncoder.js"; +import { EncodableBoolean } from "../datatype/EncodableBoolean.js"; +import { EncodableFixedInteger } from "../datatype/EncodableFixedInteger.js"; +import { DecodingError } from "../error/DecodingError.js"; +import { EncodableBitStringFields } from "../field/EncodableBitStringFields.js"; +import { USNJ_GPC_SEGMENT_FIELD_NAMES } from "../field/UsNjField.js"; +import { UsNjField } from "../field/UsNjField.js"; +import { AbstractLazilyEncodableSegment } from "./AbstractLazilyEncodableSegment.js"; + +export class UsNjGpcSegment extends AbstractLazilyEncodableSegment { + private base64UrlEncoder: AbstractBase64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); + private bitStringEncoder: BitStringEncoder = BitStringEncoder.getInstance(); + + constructor(encodedString?: string) { + super(); + if (encodedString) { + this.decode(encodedString); + } + } + + // overriden + public getFieldNames(): string[] { + return USNJ_GPC_SEGMENT_FIELD_NAMES; + } + + // overriden + protected initializeFields(): EncodableBitStringFields { + let fields: EncodableBitStringFields = new EncodableBitStringFields(); + fields.put(UsNjField.GPC_SEGMENT_TYPE.toString(), new EncodableFixedInteger(2, 1)); + fields.put(UsNjField.GPC_SEGMENT_INCLUDED.toString(), new EncodableBoolean(true)); + fields.put(UsNjField.GPC.toString(), new EncodableBoolean(false)); + return fields; + } + + // overriden + protected encodeSegment(fields: EncodableBitStringFields): string { + let bitString: string = this.bitStringEncoder.encode(fields, this.getFieldNames()); + let encodedString: string = this.base64UrlEncoder.encode(bitString); + return encodedString; + } + + // overriden + protected decodeSegment(encodedString: string, fields: EncodableBitStringFields): void { + if (encodedString == null || encodedString.length === 0) { + this.fields.reset(fields); + } + try { + let bitString: string = this.base64UrlEncoder.decode(encodedString); + this.bitStringEncoder.decode(bitString, this.getFieldNames(), fields); + } catch (e) { + throw new DecodingError("Unable to decode UsNjGpcSegment '" + encodedString + "'"); + } + } +} diff --git a/modules/cmpapi/src/encoder/segment/UsTnCoreSegment.ts b/modules/cmpapi/src/encoder/segment/UsTnCoreSegment.ts new file mode 100644 index 0000000..a50df4f --- /dev/null +++ b/modules/cmpapi/src/encoder/segment/UsTnCoreSegment.ts @@ -0,0 +1,232 @@ +import { AbstractBase64UrlEncoder } from "../base64/AbstractBase64UrlEncoder.js"; +import { CompressedBase64UrlEncoder } from "../base64/CompressedBase64UrlEncoder.js"; +import { BitStringEncoder } from "../bitstring/BitStringEncoder.js"; +import { EncodableFixedInteger } from "../datatype/EncodableFixedInteger.js"; +import { EncodableFixedIntegerList } from "../datatype/EncodableFixedIntegerList.js"; +import { Predicate } from "../datatype/validate/Predicate.js"; +import { DecodingError } from "../error/DecodingError.js"; +import { ValidationError } from "../error/ValidationError.js"; +import { EncodableBitStringFields } from "../field/EncodableBitStringFields.js"; +import { USTN_CORE_SEGMENT_FIELD_NAMES } from "../field/UsTnField.js"; +import { UsTnField } from "../field/UsTnField.js"; +import { UsTn } from "../section/UsTn.js"; +import { AbstractLazilyEncodableSegment } from "./AbstractLazilyEncodableSegment.js"; + +export class UsTnCoreSegment extends AbstractLazilyEncodableSegment { + private base64UrlEncoder: AbstractBase64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); + private bitStringEncoder: BitStringEncoder = BitStringEncoder.getInstance(); + + constructor(encodedString?: string) { + super(); + if (encodedString) { + this.decode(encodedString); + } + } + + // overriden + public getFieldNames(): string[] { + return USTN_CORE_SEGMENT_FIELD_NAMES; + } + + // overriden + protected initializeFields(): EncodableBitStringFields { + const nullableBooleanAsTwoBitIntegerValidator = new (class implements Predicate { + test(n: number): boolean { + return n >= 0 && n <= 2; + } + })(); + + const nonNullableBooleanAsTwoBitIntegerValidator = new (class implements Predicate { + test(n: number): boolean { + return n >= 1 && n <= 2; + } + })(); + const nullableBooleanAsTwoBitIntegerListValidator = new (class implements Predicate { + test(l: number[]): boolean { + for (let i = 0; i < l.length; i++) { + let n = l[i]; + if (n < 0 || n > 2) { + return false; + } + } + return true; + } + })(); + + let fields: EncodableBitStringFields = new EncodableBitStringFields(); + fields.put(UsTnField.VERSION.toString(), new EncodableFixedInteger(6, UsTn.VERSION)); + fields.put( + UsTnField.PROCESSING_NOTICE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsTnField.SALE_OPT_OUT_NOTICE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsTnField.SALE_OPT_OUT.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsTnField.TARGETED_ADVERTISING_OPT_OUT.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsTnField.SENSITIVE_DATA_PROCESSING.toString(), + new EncodableFixedIntegerList(2, [0, 0, 0, 0, 0, 0, 0, 0]).withValidator( + nullableBooleanAsTwoBitIntegerListValidator + ) + ); + fields.put( + UsTnField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsTnField.ADDITIONAL_DATA_PROCESSING_CONSENT.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsTnField.MSPA_COVERED_TRANSACTION.toString(), + new EncodableFixedInteger(2, 1).withValidator(nonNullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsTnField.MSPA_OPT_OUT_OPTION_MODE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + fields.put( + UsTnField.MSPA_SERVICE_PROVIDER_MODE.toString(), + new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator) + ); + return fields; + } + + // overriden + protected encodeSegment(fields: EncodableBitStringFields): string { + let bitString: string = this.bitStringEncoder.encode(fields, this.getFieldNames()); + let encodedString: string = this.base64UrlEncoder.encode(bitString); + return encodedString; + } + + // overriden + protected decodeSegment(encodedString: string, fields: EncodableBitStringFields): void { + if (encodedString == null || encodedString.length === 0) { + this.fields.reset(fields); + } + try { + let bitString: string = this.base64UrlEncoder.decode(encodedString); + this.bitStringEncoder.decode(bitString, this.getFieldNames(), fields); + } catch (e) { + throw new DecodingError("Unable to decode UsTnCoreSegment '" + encodedString + "'"); + } + } + + // overriden + public validate(): void { + let saleOptOutNotice: number = this.fields.get(UsTnField.SALE_OPT_OUT_NOTICE).getValue(); + let saleOptOut: number = this.fields.get(UsTnField.SALE_OPT_OUT).getValue(); + let targetedAdvertisingOptOutNotice: number = this.fields + .get(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE) + .getValue(); + let targetedAdvertisingOptOut: number = this.fields.get(UsTnField.TARGETED_ADVERTISING_OPT_OUT).getValue(); + let mspaServiceProviderMode: number = this.fields.get(UsTnField.MSPA_SERVICE_PROVIDER_MODE).getValue(); + let mspaOptOutOptionMode: number = this.fields.get(UsTnField.MSPA_OPT_OUT_OPTION_MODE).getValue(); + + if (saleOptOutNotice == 0) { + if (saleOptOut == 1 || saleOptOut == 2) { + throw new ValidationError( + "Invalid ustn sale notice / opt out combination: {" + saleOptOutNotice + " / " + saleOptOut + "}" + ); + } + } else if (saleOptOutNotice == 1) { + if (saleOptOut == 0) { + throw new ValidationError( + "Invalid ustn sale notice / opt out combination: {" + saleOptOutNotice + " / " + saleOptOut + "}" + ); + } + } else if (saleOptOutNotice == 2) { + if (saleOptOut == 0 || saleOptOut == 2) { + throw new ValidationError( + "Invalid ustn sale notice / opt out combination: {" + saleOptOutNotice + " / " + saleOptOut + "}" + ); + } + } + + if (targetedAdvertisingOptOutNotice == 0) { + if (targetedAdvertisingOptOut == 1 || targetedAdvertisingOptOut == 2) { + throw new ValidationError( + "Invalid ustn targeted advertising notice / opt out combination: {" + + targetedAdvertisingOptOutNotice + + " / " + + targetedAdvertisingOptOut + + "}" + ); + } + } else if (targetedAdvertisingOptOutNotice == 1) { + if (targetedAdvertisingOptOut == 0) { + throw new ValidationError( + "Invalid ustn targeted advertising notice / opt out combination: {" + + targetedAdvertisingOptOutNotice + + " / " + + targetedAdvertisingOptOut + + "}" + ); + } + } else if (targetedAdvertisingOptOutNotice == 2) { + if (targetedAdvertisingOptOut == 0 || targetedAdvertisingOptOut == 2) { + throw new ValidationError( + "Invalid ustn targeted advertising notice / opt out combination: {" + + targetedAdvertisingOptOutNotice + + " / " + + targetedAdvertisingOptOut + + "}" + ); + } + } + + if (mspaServiceProviderMode == 0) { + if (saleOptOutNotice == 1 || saleOptOutNotice == 2) { + throw new ValidationError( + "Invalid ustn mspa service provider mode / sale opt out notice combination: {" + + mspaServiceProviderMode + + " / " + + saleOptOutNotice + + "}" + ); + } + } else if (mspaServiceProviderMode == 1) { + if (mspaOptOutOptionMode == 0 || mspaOptOutOptionMode == 1) { + throw new ValidationError( + "Invalid ustn mspa service provider / opt out option modes combination: {" + + mspaServiceProviderMode + + " / " + + mspaServiceProviderMode + + "}" + ); + } + + if (saleOptOutNotice == 1 || saleOptOutNotice == 2) { + throw new ValidationError( + "Invalid ustn mspa service provider mode / sale opt out notice combination: {" + + mspaServiceProviderMode + + " / " + + saleOptOutNotice + + "}" + ); + } + } else if (mspaServiceProviderMode == 2) { + if (mspaOptOutOptionMode == 0 || mspaOptOutOptionMode == 2) { + throw new ValidationError( + "Invalid ustn mspa service provider / opt out option modes combination: {" + + mspaServiceProviderMode + + " / " + + mspaOptOutOptionMode + + "}" + ); + } + } + } +} diff --git a/modules/cmpapi/src/encoder/segment/UsTnGpcSegment.ts b/modules/cmpapi/src/encoder/segment/UsTnGpcSegment.ts new file mode 100644 index 0000000..cd8acee --- /dev/null +++ b/modules/cmpapi/src/encoder/segment/UsTnGpcSegment.ts @@ -0,0 +1,56 @@ +import { AbstractBase64UrlEncoder } from "../base64/AbstractBase64UrlEncoder.js"; +import { CompressedBase64UrlEncoder } from "../base64/CompressedBase64UrlEncoder.js"; +import { BitStringEncoder } from "../bitstring/BitStringEncoder.js"; +import { EncodableBoolean } from "../datatype/EncodableBoolean.js"; +import { EncodableFixedInteger } from "../datatype/EncodableFixedInteger.js"; +import { DecodingError } from "../error/DecodingError.js"; +import { EncodableBitStringFields } from "../field/EncodableBitStringFields.js"; +import { USTN_GPC_SEGMENT_FIELD_NAMES } from "../field/UsTnField.js"; +import { UsTnField } from "../field/UsTnField.js"; +import { AbstractLazilyEncodableSegment } from "./AbstractLazilyEncodableSegment.js"; + +export class UsTnGpcSegment extends AbstractLazilyEncodableSegment { + private base64UrlEncoder: AbstractBase64UrlEncoder = CompressedBase64UrlEncoder.getInstance(); + private bitStringEncoder: BitStringEncoder = BitStringEncoder.getInstance(); + + constructor(encodedString?: string) { + super(); + if (encodedString) { + this.decode(encodedString); + } + } + + // overriden + public getFieldNames(): string[] { + return USTN_GPC_SEGMENT_FIELD_NAMES; + } + + // overriden + protected initializeFields(): EncodableBitStringFields { + let fields: EncodableBitStringFields = new EncodableBitStringFields(); + fields.put(UsTnField.GPC_SEGMENT_TYPE.toString(), new EncodableFixedInteger(2, 1)); + fields.put(UsTnField.GPC_SEGMENT_INCLUDED.toString(), new EncodableBoolean(true)); + fields.put(UsTnField.GPC.toString(), new EncodableBoolean(false)); + return fields; + } + + // overriden + protected encodeSegment(fields: EncodableBitStringFields): string { + let bitString: string = this.bitStringEncoder.encode(fields, this.getFieldNames()); + let encodedString: string = this.base64UrlEncoder.encode(bitString); + return encodedString; + } + + // overriden + protected decodeSegment(encodedString: string, fields: EncodableBitStringFields): void { + if (encodedString == null || encodedString.length === 0) { + this.fields.reset(fields); + } + try { + let bitString: string = this.base64UrlEncoder.decode(encodedString); + this.bitStringEncoder.decode(bitString, this.getFieldNames(), fields); + } catch (e) { + throw new DecodingError("Unable to decode UsTnGpcSegment '" + encodedString + "'"); + } + } +} diff --git a/modules/cmpapi/src/encoder/segment/index.ts b/modules/cmpapi/src/encoder/segment/index.ts index 80841f1..3bc0d7a 100644 --- a/modules/cmpapi/src/encoder/segment/index.ts +++ b/modules/cmpapi/src/encoder/segment/index.ts @@ -14,14 +14,26 @@ export * from "./UsCoCoreSegment.js"; export * from "./UsCoGpcSegment.js"; export * from "./UsCtCoreSegment.js"; export * from "./UsCtGpcSegment.js"; +export * from "./UsDeCoreSegment.js"; +export * from "./UsDeGpcSegment.js"; export * from "./UsFlCoreSegment.js"; +export * from "./UsIaCoreSegment.js"; +export * from "./UsIaGpcSegment.js"; +export * from "./UsNatCoreSegment.js"; +export * from "./UsNeCoreSegment.js"; +export * from "./UsNeGpcSegment.js"; +export * from "./UsNhCoreSegment.js"; +export * from "./UsNhGpcSegment.js"; +export * from "./UsNjCoreSegment.js"; +export * from "./UsNjGpcSegment.js"; export * from "./UsMtCoreSegment.js"; export * from "./UsMtGpcSegment.js"; -export * from "./UsNatCoreSegment.js"; export * from "./UsNatGpcSegment.js"; export * from "./UspV1CoreSegment.js"; export * from "./UsOrCoreSegment.js"; export * from "./UsOrGpcSegment.js"; +export * from "./UsTnCoreSegment.js"; +export * from "./UsTnGpcSegment.js"; export * from "./UsTxCoreSegment.js"; export * from "./UsTxGpcSegment.js"; export * from "./UsUtCoreSegment.js"; diff --git a/modules/cmpapi/test/GppModel.test.ts b/modules/cmpapi/test/GppModel.test.ts index 8f71766..bac0fc4 100644 --- a/modules/cmpapi/test/GppModel.test.ts +++ b/modules/cmpapi/test/GppModel.test.ts @@ -50,6 +50,12 @@ describe("manifest.GppModel", (): void => { expect(gppModel.hasSection("usmt")).to.eql(false); expect(gppModel.hasSection("usor")).to.eql(false); expect(gppModel.hasSection("ustx")).to.eql(false); + expect(gppModel.hasSection("usde")).to.eql(false); + expect(gppModel.hasSection("usia")).to.eql(false); + expect(gppModel.hasSection("usne")).to.eql(false); + expect(gppModel.hasSection("usnh")).to.eql(false); + expect(gppModel.hasSection("usnj")).to.eql(false); + expect(gppModel.hasSection("ustn")).to.eql(false); gppModel.setFieldValue("tcfeuv2", "Version", 2); gppModel.setFieldValue("tcfeuv2", "Created", utcDateTime); @@ -68,6 +74,12 @@ describe("manifest.GppModel", (): void => { gppModel.setFieldValue("usmt", "Version", 1); gppModel.setFieldValue("usor", "Version", 1); gppModel.setFieldValue("ustx", "Version", 1); + gppModel.setFieldValue("usde", "Version", 1); + gppModel.setFieldValue("usia", "Version", 1); + gppModel.setFieldValue("usne", "Version", 1); + gppModel.setFieldValue("usnh", "Version", 1); + gppModel.setFieldValue("usnj", "Version", 1); + gppModel.setFieldValue("ustn", "Version", 1); expect(gppModel.hasSection("tcfeuv2")).to.eql(true); expect(gppModel.hasSection("tcfcav1")).to.eql(true); @@ -82,10 +94,16 @@ describe("manifest.GppModel", (): void => { expect(gppModel.hasSection("usmt")).to.eql(true); expect(gppModel.hasSection("usor")).to.eql(true); expect(gppModel.hasSection("ustx")).to.eql(true); + expect(gppModel.hasSection("usde")).to.eql(true); + expect(gppModel.hasSection("usia")).to.eql(true); + expect(gppModel.hasSection("usne")).to.eql(true); + expect(gppModel.hasSection("usnh")).to.eql(true); + expect(gppModel.hasSection("usnj")).to.eql(true); + expect(gppModel.hasSection("ustn")).to.eql(true); let gppString = gppModel.encode(); expect(gppString).to.eql( - "DBACOZY~CPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAAAAAA.QAAA.IAAA~BPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAAAA.YAAAAAAAAAA~1---~BAAAAAAAAQA.QA~BAAAAABA.QA~BAAAABA~BAAAAEA.QA~BAAAAAQA~BAAAAAEA.QA~BAAAAABA~BAAAAABA.QA~BAAAAAABAA.QA~BAAAAAQA.QA" + "DBACOdM~CPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAAAAAA.QAAA.IAAA~BPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAAAA.YAAAAAAAAAA~1---~BAAAAAAAAABA.QA~BAAAAABA.QA~BAAAABA~BAAAAEA.QA~BAAAAAQA~BAAAAAEA.QA~BAAAAABA~BAAAAABA.QA~BAAAAAABAA.QA~BAAAAAQA.QA~BAAAAAABAA.QA~BAAAAAQA.QA~BAAAAAQA.QA~BAAAAABA.QA~BAAAAAAAQA.QA~BAAAAAQA.QA" ); }); @@ -381,7 +399,7 @@ describe("manifest.GppModel", (): void => { it("should decode defaults from all sections", (): void => { let gppString = - "DBACOaw~CPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAAAAAA.QAAA.IAAA~BPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAA.YAAAAAAAAAA~1---~BAAAAAAAAQA.QA~BAAAAABA.QA~BAAAABA~BAAAAEA.QA~BAAAAAQA~BAAAAAEA.QA"; + "DBACOdM~CPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAAAAAA.QAAA.IAAA~BPSG_8APSG_8AAAAAAENAACAAAAAAAAAAAAAAAAAAA.YAAAAAAAAAA~1---~BAAAAAAAAABA.QA~BAAAAABA.QA~BAAAABA~BAAAAEA.QA~BAAAAAQA~BAAAAAEA.QA~BAAAAABA~BAAAAABA.QA~BAAAAAABAA.QA~BAAAAAQA.QA~BAAAAAABAA.QA~BAAAAAQA.QA~BAAAAAQA.QA~BAAAAABA.QA~BAAAAAAAQA.QA~BAAAAAQA.QA"; let gppModel = new GppModel(gppString); expect(gppModel.hasSection("tcfeuv2")).to.eql(true); @@ -393,6 +411,16 @@ describe("manifest.GppModel", (): void => { expect(gppModel.hasSection("usco")).to.eql(true); expect(gppModel.hasSection("usut")).to.eql(true); expect(gppModel.hasSection("usct")).to.eql(true); + expect(gppModel.hasSection("usfl")).to.eql(true); + expect(gppModel.hasSection("usmt")).to.eql(true); + expect(gppModel.hasSection("usor")).to.eql(true); + expect(gppModel.hasSection("ustx")).to.eql(true); + expect(gppModel.hasSection("usde")).to.eql(true); + expect(gppModel.hasSection("usia")).to.eql(true); + expect(gppModel.hasSection("usne")).to.eql(true); + expect(gppModel.hasSection("usnh")).to.eql(true); + expect(gppModel.hasSection("usnj")).to.eql(true); + expect(gppModel.hasSection("ustn")).to.eql(true); }); it("should decode uspv1 section", (): void => { diff --git a/modules/cmpapi/test/encoder/section/UsDe.test.ts b/modules/cmpapi/test/encoder/section/UsDe.test.ts new file mode 100644 index 0000000..f73dc78 --- /dev/null +++ b/modules/cmpapi/test/encoder/section/UsDe.test.ts @@ -0,0 +1,320 @@ +import { expect } from "chai"; +import { UsDeField } from "../../../src/encoder/field/UsDeField"; +import { UsDe } from "../../../src/encoder/section/UsDe"; + +describe("manifest.section.UsDe", (): void => { + it("should encode default to BAAAAAABAA.QA", (): void => { + let usDe = new UsDe(); + expect(usDe.encode()).to.eql("BAAAAAABAA.QA"); + }); + + it("should encode to BVWSSSSVYA.YA", (): void => { + let usDe = new UsDe(); + + usDe.setFieldValue(UsDeField.PROCESSING_NOTICE, 1); + usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 1); + usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); + usDe.setFieldValue(UsDeField.SALE_OPT_OUT, 1); + usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT, 1); + usDe.setFieldValue(UsDeField.SENSITIVE_DATA_PROCESSING, [2, 1, 0, 2, 1, 0, 2, 1, 0]); + usDe.setFieldValue(UsDeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, [2, 1, 0, 2, 1]); + usDe.setFieldValue(UsDeField.ADDITIONAL_DATA_PROCESSING_CONSENT, 1); + usDe.setFieldValue(UsDeField.MSPA_COVERED_TRANSACTION, 1); + usDe.setFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE, 1); + usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 2); + usDe.setFieldValue(UsDeField.GPC, true); + + expect(usDe.encode()).to.eql("BVWSSSSVYA.YA"); + }); + + it("should encode default to BAAAAAABAA", (): void => { + let usDe = new UsDe(); + usDe.setFieldValue(UsDeField.GPC_SEGMENT_INCLUDED, false); + expect(usDe.encode()).to.eql("BAAAAAABAA"); + }); + + it("should throw an error if invalid values are set", (): void => { + let usDe = new UsDe(); + + expect(function () { + usDe.setFieldValue(UsDeField.PROCESSING_NOTICE, 3); + }).to.throw(); + + expect(function () { + usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 3); + }).to.throw(); + + expect(function () { + usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 3); + }).to.throw(); + + expect(function () { + usDe.setFieldValue(UsDeField.SALE_OPT_OUT, 3); + }).to.throw(); + + expect(function () { + usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT, -1); + }).to.throw(); + + expect(function () { + usDe.setFieldValue(UsDeField.SENSITIVE_DATA_PROCESSING, [0, 1, 2, 3, 1, 2, 0, 1]); + }).to.throw(); + + expect(function () { + usDe.setFieldValue(UsDeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, [1, 2, 3]); + }).to.throw(); + + expect(function () { + usDe.setFieldValue(UsDeField.ADDITIONAL_DATA_PROCESSING_CONSENT, 3); + }).to.throw(); + + expect(function () { + usDe.setFieldValue(UsDeField.MSPA_COVERED_TRANSACTION, 0); + }).to.throw(); + + expect(function () { + usDe.setFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE, 4); + }).to.throw(); + + expect(function () { + usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, -1); + }).to.throw(); + }); + + it("should validate sale", (): void => { + let usDe = new UsDe(); + + expect(function () { + usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 0); + usDe.setFieldValue(UsDeField.SALE_OPT_OUT, 1); + usDe.encode(); + }).to.throw(); + + expect(function () { + usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 0); + usDe.setFieldValue(UsDeField.SALE_OPT_OUT, 2); + usDe.encode(); + }).to.throw(); + + expect(function () { + usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 1); + usDe.setFieldValue(UsDeField.SALE_OPT_OUT, 0); + usDe.encode(); + }).to.throw(); + + expect(function () { + usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 2); + usDe.setFieldValue(UsDeField.SALE_OPT_OUT, 0); + usDe.encode(); + }).to.throw(); + + expect(function () { + usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 2); + usDe.setFieldValue(UsDeField.SALE_OPT_OUT, 2); + usDe.encode(); + }).to.throw(); + + usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 0); + usDe.setFieldValue(UsDeField.SALE_OPT_OUT, 0); + usDe.encode(); + + usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 1); + usDe.setFieldValue(UsDeField.SALE_OPT_OUT, 1); + usDe.encode(); + + usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 1); + usDe.setFieldValue(UsDeField.SALE_OPT_OUT, 2); + usDe.encode(); + + usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 2); + usDe.setFieldValue(UsDeField.SALE_OPT_OUT, 1); + usDe.encode(); + }); + + it("should validate targeted advertising", (): void => { + let usDe = new UsDe(); + + expect(function () { + usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); + usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT, 1); + usDe.encode(); + }).to.throw(); + + expect(function () { + usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); + usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT, 2); + usDe.encode(); + }).to.throw(); + + expect(function () { + usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); + usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT, 0); + usDe.encode(); + }).to.throw(); + + expect(function () { + usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); + usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT, 0); + usDe.encode(); + }).to.throw(); + + expect(function () { + usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); + usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT, 2); + usDe.encode(); + }).to.throw(); + + usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); + usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT, 0); + usDe.encode(); + + usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); + usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT, 1); + usDe.encode(); + + usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); + usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT, 2); + usDe.encode(); + + usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); + usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT, 1); + usDe.encode(); + }); + + it("should validate mspa", (): void => { + let usDe = new UsDe(); + + expect(function () { + usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 1); + usDe.setFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE, 0); + usDe.encode(); + }).to.throw(); + + expect(function () { + usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 1); + usDe.setFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE, 1); + usDe.encode(); + }).to.throw(); + + expect(function () { + usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 2); + usDe.setFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE, 0); + usDe.encode(); + }).to.throw(); + + expect(function () { + usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 2); + usDe.setFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE, 2); + usDe.encode(); + }).to.throw(); + + expect(function () { + usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 0); + usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 1); + usDe.encode(); + }).to.throw(); + + expect(function () { + usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 0); + usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 2); + usDe.encode(); + }).to.throw(); + + expect(function () { + usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 1); + usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 1); + usDe.encode(); + }).to.throw(); + + expect(function () { + usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 1); + usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 2); + usDe.encode(); + }).to.throw(); + + usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 0); + + usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 0); + usDe.setFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE, 0); + usDe.encode(); + + usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 0); + usDe.setFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE, 1); + usDe.encode(); + + usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 0); + usDe.setFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE, 2); + usDe.encode(); + + usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 1); + usDe.setFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE, 2); + usDe.encode(); + + usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 2); + usDe.setFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE, 1); + usDe.encode(); + + usDe.setFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE, 0); + + usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 0); + usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 0); + usDe.encode(); + + usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 1); + usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 0); + usDe.encode(); + + usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 2); + usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 0); + usDe.encode(); + + usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 2); + usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 1); + usDe.encode(); + + usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 2); + usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 2); + usDe.encode(); + }); + + it("should decode BVWSSSSVYA.YA", (): void => { + let usDe = new UsDe("BVWSSSSVYA.YA"); + + expect(1, usDe.getFieldValue(UsDeField.PROCESSING_NOTICE)); + expect(1, usDe.getFieldValue(UsDeField.SALE_OPT_OUT_NOTICE)); + expect(1, usDe.getFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE)); + expect(1, usDe.getFieldValue(UsDeField.SALE_OPT_OUT)); + expect(1, usDe.getFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT)); + expect([2, 1, 0, 2, 1, 0, 2, 1, 0], usDe.getFieldValue(UsDeField.SENSITIVE_DATA_PROCESSING)); + expect([2, 1, 0, 2, 1], usDe.getFieldValue(UsDeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS)); + expect(1, usDe.getFieldValue(UsDeField.ADDITIONAL_DATA_PROCESSING_CONSENT)); + expect(1, usDe.getFieldValue(UsDeField.MSPA_COVERED_TRANSACTION)); + expect(1, usDe.getFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE)); + expect(2, usDe.getFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE)); + expect(true, usDe.getFieldValue(UsDeField.GPC)); + expect(true, usDe.getFieldValue(UsDeField.GPC_SEGMENT_INCLUDED)); + }); + + it("should decode BVWSSSSVYA", (): void => { + let usDe = new UsDe("BVWSSSSVYA"); + + expect(1, usDe.getFieldValue(UsDeField.PROCESSING_NOTICE)); + expect(1, usDe.getFieldValue(UsDeField.SALE_OPT_OUT_NOTICE)); + expect(1, usDe.getFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE)); + expect(1, usDe.getFieldValue(UsDeField.SALE_OPT_OUT)); + expect(1, usDe.getFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT)); + expect([2, 1, 0, 2, 1, 0, 2, 1, 0], usDe.getFieldValue(UsDeField.SENSITIVE_DATA_PROCESSING)); + expect([2, 1, 0, 2, 1], usDe.getFieldValue(UsDeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS)); + expect(1, usDe.getFieldValue(UsDeField.ADDITIONAL_DATA_PROCESSING_CONSENT)); + expect(1, usDe.getFieldValue(UsDeField.MSPA_COVERED_TRANSACTION)); + expect(1, usDe.getFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE)); + expect(2, usDe.getFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE)); + expect(false, usDe.getFieldValue(UsDeField.GPC_SEGMENT_INCLUDED)); + }); + + it("should throw Error on garbage", (): void => { + expect(function () { + new UsDe("z").getFieldValue(UsDeField.SALE_OPT_OUT); + }).to.throw("Unable to decode UsDeCoreSegment 'z'"); + }); +}); diff --git a/modules/cmpapi/test/encoder/section/UsIa.test.ts b/modules/cmpapi/test/encoder/section/UsIa.test.ts new file mode 100644 index 0000000..5fe4678 --- /dev/null +++ b/modules/cmpapi/test/encoder/section/UsIa.test.ts @@ -0,0 +1,320 @@ +import { expect } from "chai"; +import { UsIaField } from "../../../src/encoder/field/UsIaField"; +import { UsIa } from "../../../src/encoder/section/UsIa"; + +describe("manifest.section.UsIa", (): void => { + it("should encode default to BAAAAAQA.QA", (): void => { + let usIa = new UsIa(); + expect(usIa.encode()).to.eql("BAAAAAQA.QA"); + }); + + it("should encode to BVVkklWA.YA", (): void => { + let usIa = new UsIa(); + + usIa.setFieldValue(UsIaField.PROCESSING_NOTICE, 1); + usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 1); + usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); + usIa.setFieldValue(UsIaField.SENSITIVE_DATA_OPT_OUT_NOTICE, 1); + usIa.setFieldValue(UsIaField.SALE_OPT_OUT, 1); + usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT, 1); + usIa.setFieldValue(UsIaField.SENSITIVE_DATA_PROCESSING, [2, 1, 0, 2, 1, 0, 2, 1]); + usIa.setFieldValue(UsIaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, 1); + usIa.setFieldValue(UsIaField.MSPA_COVERED_TRANSACTION, 1); + usIa.setFieldValue(UsIaField.MSPA_OPT_OUT_OPTION_MODE, 1); + usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 2); + usIa.setFieldValue(UsIaField.GPC, true); + + expect(usIa.encode()).to.eql("BVVkklWA.YA"); + }); + + it("should encode default to BAAAAAQA", (): void => { + let usIa = new UsIa(); + usIa.setFieldValue(UsIaField.GPC_SEGMENT_INCLUDED, false); + expect(usIa.encode()).to.eql("BAAAAAQA"); + }); + + it("should throw an error if invalid values are set", (): void => { + let usIa = new UsIa(); + + expect(function () { + usIa.setFieldValue(UsIaField.PROCESSING_NOTICE, 3); + }).to.throw(); + + expect(function () { + usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 3); + }).to.throw(); + + expect(function () { + usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 3); + }).to.throw(); + + expect(function () { + usIa.setFieldValue(UsIaField.SENSITIVE_DATA_OPT_OUT_NOTICE, 3); + }).to.throw(); + + expect(function () { + usIa.setFieldValue(UsIaField.SALE_OPT_OUT, 3); + }).to.throw(); + + expect(function () { + usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT, -1); + }).to.throw(); + + expect(function () { + usIa.setFieldValue(UsIaField.SENSITIVE_DATA_PROCESSING, [0, 1, 2, 3, 1, 2, 0, 1]); + }).to.throw(); + + expect(function () { + usIa.setFieldValue(UsIaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, [1, 2, 3]); + }).to.throw(); + + expect(function () { + usIa.setFieldValue(UsIaField.MSPA_COVERED_TRANSACTION, 0); + }).to.throw(); + + expect(function () { + usIa.setFieldValue(UsIaField.MSPA_OPT_OUT_OPTION_MODE, 4); + }).to.throw(); + + expect(function () { + usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, -1); + }).to.throw(); + }); + + it("should validate sale", (): void => { + let usIa = new UsIa(); + + expect(function () { + usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 0); + usIa.setFieldValue(UsIaField.SALE_OPT_OUT, 1); + usIa.encode(); + }).to.throw(); + + expect(function () { + usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 0); + usIa.setFieldValue(UsIaField.SALE_OPT_OUT, 2); + usIa.encode(); + }).to.throw(); + + expect(function () { + usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 1); + usIa.setFieldValue(UsIaField.SALE_OPT_OUT, 0); + usIa.encode(); + }).to.throw(); + + expect(function () { + usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 2); + usIa.setFieldValue(UsIaField.SALE_OPT_OUT, 0); + usIa.encode(); + }).to.throw(); + + expect(function () { + usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 2); + usIa.setFieldValue(UsIaField.SALE_OPT_OUT, 2); + usIa.encode(); + }).to.throw(); + + usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 0); + usIa.setFieldValue(UsIaField.SALE_OPT_OUT, 0); + usIa.encode(); + + usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 1); + usIa.setFieldValue(UsIaField.SALE_OPT_OUT, 1); + usIa.encode(); + + usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 1); + usIa.setFieldValue(UsIaField.SALE_OPT_OUT, 2); + usIa.encode(); + + usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 2); + usIa.setFieldValue(UsIaField.SALE_OPT_OUT, 1); + usIa.encode(); + }); + + it("should validate targeted advertising", (): void => { + let usIa = new UsIa(); + + expect(function () { + usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); + usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT, 1); + usIa.encode(); + }).to.throw(); + + expect(function () { + usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); + usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT, 2); + usIa.encode(); + }).to.throw(); + + expect(function () { + usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); + usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT, 0); + usIa.encode(); + }).to.throw(); + + expect(function () { + usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); + usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT, 0); + usIa.encode(); + }).to.throw(); + + expect(function () { + usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); + usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT, 2); + usIa.encode(); + }).to.throw(); + + usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); + usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT, 0); + usIa.encode(); + + usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); + usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT, 1); + usIa.encode(); + + usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); + usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT, 2); + usIa.encode(); + + usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); + usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT, 1); + usIa.encode(); + }); + + it("should validate mspa", (): void => { + let usIa = new UsIa(); + + expect(function () { + usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 1); + usIa.setFieldValue(UsIaField.MSPA_OPT_OUT_OPTION_MODE, 0); + usIa.encode(); + }).to.throw(); + + expect(function () { + usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 1); + usIa.setFieldValue(UsIaField.MSPA_OPT_OUT_OPTION_MODE, 1); + usIa.encode(); + }).to.throw(); + + expect(function () { + usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 2); + usIa.setFieldValue(UsIaField.MSPA_OPT_OUT_OPTION_MODE, 0); + usIa.encode(); + }).to.throw(); + + expect(function () { + usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 2); + usIa.setFieldValue(UsIaField.MSPA_OPT_OUT_OPTION_MODE, 2); + usIa.encode(); + }).to.throw(); + + expect(function () { + usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 0); + usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 1); + usIa.encode(); + }).to.throw(); + + expect(function () { + usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 0); + usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 2); + usIa.encode(); + }).to.throw(); + + expect(function () { + usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 1); + usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 1); + usIa.encode(); + }).to.throw(); + + expect(function () { + usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 1); + usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 2); + usIa.encode(); + }).to.throw(); + + usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 0); + + usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 0); + usIa.setFieldValue(UsIaField.MSPA_OPT_OUT_OPTION_MODE, 0); + usIa.encode(); + + usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 0); + usIa.setFieldValue(UsIaField.MSPA_OPT_OUT_OPTION_MODE, 1); + usIa.encode(); + + usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 0); + usIa.setFieldValue(UsIaField.MSPA_OPT_OUT_OPTION_MODE, 2); + usIa.encode(); + + usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 1); + usIa.setFieldValue(UsIaField.MSPA_OPT_OUT_OPTION_MODE, 2); + usIa.encode(); + + usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 2); + usIa.setFieldValue(UsIaField.MSPA_OPT_OUT_OPTION_MODE, 1); + usIa.encode(); + + usIa.setFieldValue(UsIaField.MSPA_OPT_OUT_OPTION_MODE, 0); + + usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 0); + usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 0); + usIa.encode(); + + usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 1); + usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 0); + usIa.encode(); + + usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 2); + usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 0); + usIa.encode(); + + usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 2); + usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 1); + usIa.encode(); + + usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 2); + usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 2); + usIa.encode(); + }); + + it("should decode BVVkklWA.YA", (): void => { + let usIa = new UsIa("BVVkklWA.YA"); + + expect(1, usIa.getFieldValue(UsIaField.PROCESSING_NOTICE)); + expect(1, usIa.getFieldValue(UsIaField.SALE_OPT_OUT_NOTICE)); + expect(1, usIa.getFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE)); + expect(1, usIa.getFieldValue(UsIaField.SENSITIVE_DATA_OPT_OUT_NOTICE)); + expect(1, usIa.getFieldValue(UsIaField.SALE_OPT_OUT)); + expect(1, usIa.getFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT)); + expect([2, 1, 0, 2, 1, 0, 2, 1], usIa.getFieldValue(UsIaField.SENSITIVE_DATA_PROCESSING)); + expect(1, usIa.getFieldValue(UsIaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS)); + expect(1, usIa.getFieldValue(UsIaField.MSPA_COVERED_TRANSACTION)); + expect(1, usIa.getFieldValue(UsIaField.MSPA_OPT_OUT_OPTION_MODE)); + expect(2, usIa.getFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE)); + expect(true, usIa.getFieldValue(UsIaField.GPC)); + expect(true, usIa.getFieldValue(UsIaField.GPC_SEGMENT_INCLUDED)); + }); + + it("should decode BVVkklWA", (): void => { + let usIa = new UsIa("BVVkklWA"); + + expect(1, usIa.getFieldValue(UsIaField.PROCESSING_NOTICE)); + expect(1, usIa.getFieldValue(UsIaField.SALE_OPT_OUT_NOTICE)); + expect(1, usIa.getFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE)); + expect(1, usIa.getFieldValue(UsIaField.SENSITIVE_DATA_OPT_OUT_NOTICE)); + expect(1, usIa.getFieldValue(UsIaField.SALE_OPT_OUT)); + expect(1, usIa.getFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT)); + expect([2, 1, 0, 2, 1, 0, 2, 1], usIa.getFieldValue(UsIaField.SENSITIVE_DATA_PROCESSING)); + expect(1, usIa.getFieldValue(UsIaField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS)); + expect(1, usIa.getFieldValue(UsIaField.MSPA_COVERED_TRANSACTION)); + expect(1, usIa.getFieldValue(UsIaField.MSPA_OPT_OUT_OPTION_MODE)); + expect(2, usIa.getFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE)); + expect(false, usIa.getFieldValue(UsIaField.GPC_SEGMENT_INCLUDED)); + }); + + it("should throw Error on garbage", (): void => { + expect(function () { + new UsIa("z").getFieldValue(UsIaField.SALE_OPT_OUT); + }).to.throw("Unable to decode UsIaCoreSegment 'z'"); + }); +}); diff --git a/modules/cmpapi/test/encoder/section/UsNat.test.ts b/modules/cmpapi/test/encoder/section/UsNat.test.ts index e9ca606..bc0fe20 100644 --- a/modules/cmpapi/test/encoder/section/UsNat.test.ts +++ b/modules/cmpapi/test/encoder/section/UsNat.test.ts @@ -3,12 +3,12 @@ import { UsNatField } from "../../../src/encoder/field/UsNatField"; import { UsNat } from "../../../src/encoder/section/UsNat"; describe("manifest.section.UsNat", (): void => { - it("should encode default to BAAAAAAAAQA.QA", (): void => { + it("should encode default to BAAAAAAAAABA.QA", (): void => { let usNat = new UsNat(); - expect(usNat.encode()).to.eql("BAAAAAAAAQA.QA"); + expect(usNat.encode()).to.eql("BAAAAAAAAABA.QA"); }); - it("should encode to BVVVkkkklWA.YA", (): void => { + it("should encode to BVVVkkkkkpFY.YA", (): void => { let usNat = new UsNat(); usNat.setFieldValue(UsNatField.SHARING_NOTICE, 1); @@ -20,21 +20,21 @@ describe("manifest.section.UsNat", (): void => { usNat.setFieldValue(UsNatField.SALE_OPT_OUT, 1); usNat.setFieldValue(UsNatField.SHARING_OPT_OUT, 1); usNat.setFieldValue(UsNatField.TARGETED_ADVERTISING_OPT_OUT, 1); - usNat.setFieldValue(UsNatField.SENSITIVE_DATA_PROCESSING, [2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0]); - usNat.setFieldValue(UsNatField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, [2, 1]); + usNat.setFieldValue(UsNatField.SENSITIVE_DATA_PROCESSING, [2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2]); + usNat.setFieldValue(UsNatField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, [2, 1, 0]); usNat.setFieldValue(UsNatField.PERSONAL_DATA_CONSENTS, 1); usNat.setFieldValue(UsNatField.MSPA_COVERED_TRANSACTION, 1); usNat.setFieldValue(UsNatField.MSPA_OPT_OUT_OPTION_MODE, 1); usNat.setFieldValue(UsNatField.MSPA_SERVICE_PROVIDER_MODE, 2); usNat.setFieldValue(UsNatField.GPC, true); - expect(usNat.encode()).to.eql("BVVVkkkklWA.YA"); + expect(usNat.encode()).to.eql("BVVVkkkkkpFY.YA"); }); - it("should encode default to BAAAAAAAAQA", (): void => { + it("should encode default to BAAAAAAAAABA", (): void => { let usNat = new UsNat(); usNat.setFieldValue(UsNatField.GPC_SEGMENT_INCLUDED, false); - expect(usNat.encode()).to.eql("BAAAAAAAAQA"); + expect(usNat.encode()).to.eql("BAAAAAAAAABA"); }); it("should throw an error if invalid values are set", (): void => { @@ -407,8 +407,8 @@ describe("manifest.section.UsNat", (): void => { usNat.encode(); }); - it("should decode BVVVkkkklWA.YA", (): void => { - let usNat = new UsNat("BVVVkkkklWA.YA"); + it("should decode BVVVkkkkkpFY.YA", (): void => { + let usNat = new UsNat("BVVVkkkkkpFY.YA"); expect(1, usNat.getFieldValue(UsNatField.SHARING_NOTICE)); expect(1, usNat.getFieldValue(UsNatField.SALE_OPT_OUT_NOTICE)); @@ -419,8 +419,8 @@ describe("manifest.section.UsNat", (): void => { expect(1, usNat.getFieldValue(UsNatField.SALE_OPT_OUT)); expect(1, usNat.getFieldValue(UsNatField.SHARING_OPT_OUT)); expect(1, usNat.getFieldValue(UsNatField.TARGETED_ADVERTISING_OPT_OUT)); - expect([2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0], usNat.getFieldValue(UsNatField.SENSITIVE_DATA_PROCESSING)); - expect([2, 1], usNat.getFieldValue(UsNatField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS)); + expect([2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2], usNat.getFieldValue(UsNatField.SENSITIVE_DATA_PROCESSING)); + expect([2, 1, 0], usNat.getFieldValue(UsNatField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS)); expect(1, usNat.getFieldValue(UsNatField.PERSONAL_DATA_CONSENTS)); expect(1, usNat.getFieldValue(UsNatField.MSPA_COVERED_TRANSACTION)); expect(1, usNat.getFieldValue(UsNatField.MSPA_OPT_OUT_OPTION_MODE)); @@ -429,24 +429,24 @@ describe("manifest.section.UsNat", (): void => { expect(true, usNat.getFieldValue(UsNatField.GPC_SEGMENT_INCLUDED)); }); - it("should decode BbbbGxsbFbA", (): void => { - let usNat = new UsNat("BbbbGxsbFbA"); + it("should decode BVVVkkkkkpFY.YA", (): void => { + let usNat = new UsNat("BVVVkkkkkpFY"); expect(1, usNat.getFieldValue(UsNatField.SHARING_NOTICE)); - expect(2, usNat.getFieldValue(UsNatField.SALE_OPT_OUT_NOTICE)); - expect(3, usNat.getFieldValue(UsNatField.SHARING_OPT_OUT_NOTICE)); + expect(1, usNat.getFieldValue(UsNatField.SALE_OPT_OUT_NOTICE)); + expect(1, usNat.getFieldValue(UsNatField.SHARING_OPT_OUT_NOTICE)); expect(1, usNat.getFieldValue(UsNatField.TARGETED_ADVERTISING_OPT_OUT_NOTICE)); - expect(2, usNat.getFieldValue(UsNatField.SENSITIVE_DATA_PROCESSING_OPT_OUT_NOTICE)); - expect(3, usNat.getFieldValue(UsNatField.SENSITIVE_DATA_LIMIT_USE_NOTICE)); + expect(1, usNat.getFieldValue(UsNatField.SENSITIVE_DATA_PROCESSING_OPT_OUT_NOTICE)); + expect(1, usNat.getFieldValue(UsNatField.SENSITIVE_DATA_LIMIT_USE_NOTICE)); expect(1, usNat.getFieldValue(UsNatField.SALE_OPT_OUT)); - expect(2, usNat.getFieldValue(UsNatField.SHARING_OPT_OUT)); - expect(3, usNat.getFieldValue(UsNatField.TARGETED_ADVERTISING_OPT_OUT)); - expect([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], usNat.getFieldValue(UsNatField.SENSITIVE_DATA_PROCESSING)); - expect([0, 1], usNat.getFieldValue(UsNatField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS)); + expect(1, usNat.getFieldValue(UsNatField.SHARING_OPT_OUT)); + expect(1, usNat.getFieldValue(UsNatField.TARGETED_ADVERTISING_OPT_OUT)); + expect([2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2], usNat.getFieldValue(UsNatField.SENSITIVE_DATA_PROCESSING)); + expect([2, 1, 0], usNat.getFieldValue(UsNatField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS)); expect(1, usNat.getFieldValue(UsNatField.PERSONAL_DATA_CONSENTS)); expect(1, usNat.getFieldValue(UsNatField.MSPA_COVERED_TRANSACTION)); - expect(2, usNat.getFieldValue(UsNatField.MSPA_OPT_OUT_OPTION_MODE)); - expect(3, usNat.getFieldValue(UsNatField.MSPA_SERVICE_PROVIDER_MODE)); + expect(1, usNat.getFieldValue(UsNatField.MSPA_OPT_OUT_OPTION_MODE)); + expect(2, usNat.getFieldValue(UsNatField.MSPA_SERVICE_PROVIDER_MODE)); expect(false, usNat.getFieldValue(UsNatField.GPC_SEGMENT_INCLUDED)); }); diff --git a/modules/cmpapi/test/encoder/section/UsNe.test.ts b/modules/cmpapi/test/encoder/section/UsNe.test.ts new file mode 100644 index 0000000..98631b5 --- /dev/null +++ b/modules/cmpapi/test/encoder/section/UsNe.test.ts @@ -0,0 +1,320 @@ +import { expect } from "chai"; +import { UsNeField } from "../../../src/encoder/field/UsNeField"; +import { UsNe } from "../../../src/encoder/section/UsNe"; + +describe("manifest.section.UsNe", (): void => { + it("should encode default to BAAAAAQA.QA", (): void => { + let usNe = new UsNe(); + expect(usNe.encode()).to.eql("BAAAAAQA.QA"); + }); + + it("should encode to BVWSSVWA.YA", (): void => { + let usNe = new UsNe(); + + usNe.setFieldValue(UsNeField.PROCESSING_NOTICE, 1); + usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 1); + usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); + usNe.setFieldValue(UsNeField.SALE_OPT_OUT, 1); + usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT, 1); + usNe.setFieldValue(UsNeField.SENSITIVE_DATA_PROCESSING, [2, 1, 0, 2, 1, 0, 2, 1]); + usNe.setFieldValue(UsNeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, 1); + usNe.setFieldValue(UsNeField.ADDITIONAL_DATA_PROCESSING_CONSENT, 1); + usNe.setFieldValue(UsNeField.MSPA_COVERED_TRANSACTION, 1); + usNe.setFieldValue(UsNeField.MSPA_OPT_OUT_OPTION_MODE, 1); + usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 2); + usNe.setFieldValue(UsNeField.GPC, true); + + expect(usNe.encode()).to.eql("BVWSSVWA.YA"); + }); + + it("should encode default to BAAAAAQA", (): void => { + let usNe = new UsNe(); + usNe.setFieldValue(UsNeField.GPC_SEGMENT_INCLUDED, false); + expect(usNe.encode()).to.eql("BAAAAAQA"); + }); + + it("should throw an error if invalid values are set", (): void => { + let usNe = new UsNe(); + + expect(function () { + usNe.setFieldValue(UsNeField.PROCESSING_NOTICE, 3); + }).to.throw(); + + expect(function () { + usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 3); + }).to.throw(); + + expect(function () { + usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 3); + }).to.throw(); + + expect(function () { + usNe.setFieldValue(UsNeField.SALE_OPT_OUT, 3); + }).to.throw(); + + expect(function () { + usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT, -1); + }).to.throw(); + + expect(function () { + usNe.setFieldValue(UsNeField.SENSITIVE_DATA_PROCESSING, [0, 1, 2, 3, 1, 2, 0, 1]); + }).to.throw(); + + expect(function () { + usNe.setFieldValue(UsNeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, [1, 2, 3]); + }).to.throw(); + + expect(function () { + usNe.setFieldValue(UsNeField.ADDITIONAL_DATA_PROCESSING_CONSENT, 3); + }).to.throw(); + + expect(function () { + usNe.setFieldValue(UsNeField.MSPA_COVERED_TRANSACTION, 0); + }).to.throw(); + + expect(function () { + usNe.setFieldValue(UsNeField.MSPA_OPT_OUT_OPTION_MODE, 4); + }).to.throw(); + + expect(function () { + usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, -1); + }).to.throw(); + }); + + it("should validate sale", (): void => { + let usNe = new UsNe(); + + expect(function () { + usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 0); + usNe.setFieldValue(UsNeField.SALE_OPT_OUT, 1); + usNe.encode(); + }).to.throw(); + + expect(function () { + usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 0); + usNe.setFieldValue(UsNeField.SALE_OPT_OUT, 2); + usNe.encode(); + }).to.throw(); + + expect(function () { + usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 1); + usNe.setFieldValue(UsNeField.SALE_OPT_OUT, 0); + usNe.encode(); + }).to.throw(); + + expect(function () { + usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 2); + usNe.setFieldValue(UsNeField.SALE_OPT_OUT, 0); + usNe.encode(); + }).to.throw(); + + expect(function () { + usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 2); + usNe.setFieldValue(UsNeField.SALE_OPT_OUT, 2); + usNe.encode(); + }).to.throw(); + + usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 0); + usNe.setFieldValue(UsNeField.SALE_OPT_OUT, 0); + usNe.encode(); + + usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 1); + usNe.setFieldValue(UsNeField.SALE_OPT_OUT, 1); + usNe.encode(); + + usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 1); + usNe.setFieldValue(UsNeField.SALE_OPT_OUT, 2); + usNe.encode(); + + usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 2); + usNe.setFieldValue(UsNeField.SALE_OPT_OUT, 1); + usNe.encode(); + }); + + it("should validate targeted advertising", (): void => { + let usNe = new UsNe(); + + expect(function () { + usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); + usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT, 1); + usNe.encode(); + }).to.throw(); + + expect(function () { + usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); + usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT, 2); + usNe.encode(); + }).to.throw(); + + expect(function () { + usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); + usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT, 0); + usNe.encode(); + }).to.throw(); + + expect(function () { + usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); + usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT, 0); + usNe.encode(); + }).to.throw(); + + expect(function () { + usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); + usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT, 2); + usNe.encode(); + }).to.throw(); + + usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); + usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT, 0); + usNe.encode(); + + usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); + usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT, 1); + usNe.encode(); + + usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); + usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT, 2); + usNe.encode(); + + usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); + usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT, 1); + usNe.encode(); + }); + + it("should validate mspa", (): void => { + let usNe = new UsNe(); + + expect(function () { + usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 1); + usNe.setFieldValue(UsNeField.MSPA_OPT_OUT_OPTION_MODE, 0); + usNe.encode(); + }).to.throw(); + + expect(function () { + usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 1); + usNe.setFieldValue(UsNeField.MSPA_OPT_OUT_OPTION_MODE, 1); + usNe.encode(); + }).to.throw(); + + expect(function () { + usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 2); + usNe.setFieldValue(UsNeField.MSPA_OPT_OUT_OPTION_MODE, 0); + usNe.encode(); + }).to.throw(); + + expect(function () { + usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 2); + usNe.setFieldValue(UsNeField.MSPA_OPT_OUT_OPTION_MODE, 2); + usNe.encode(); + }).to.throw(); + + expect(function () { + usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 0); + usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 1); + usNe.encode(); + }).to.throw(); + + expect(function () { + usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 0); + usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 2); + usNe.encode(); + }).to.throw(); + + expect(function () { + usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 1); + usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 1); + usNe.encode(); + }).to.throw(); + + expect(function () { + usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 1); + usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 2); + usNe.encode(); + }).to.throw(); + + usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 0); + + usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 0); + usNe.setFieldValue(UsNeField.MSPA_OPT_OUT_OPTION_MODE, 0); + usNe.encode(); + + usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 0); + usNe.setFieldValue(UsNeField.MSPA_OPT_OUT_OPTION_MODE, 1); + usNe.encode(); + + usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 0); + usNe.setFieldValue(UsNeField.MSPA_OPT_OUT_OPTION_MODE, 2); + usNe.encode(); + + usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 1); + usNe.setFieldValue(UsNeField.MSPA_OPT_OUT_OPTION_MODE, 2); + usNe.encode(); + + usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 2); + usNe.setFieldValue(UsNeField.MSPA_OPT_OUT_OPTION_MODE, 1); + usNe.encode(); + + usNe.setFieldValue(UsNeField.MSPA_OPT_OUT_OPTION_MODE, 0); + + usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 0); + usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 0); + usNe.encode(); + + usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 1); + usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 0); + usNe.encode(); + + usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 2); + usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 0); + usNe.encode(); + + usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 2); + usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 1); + usNe.encode(); + + usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 2); + usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 2); + usNe.encode(); + }); + + it("should decode BVWSSVWA.YA", (): void => { + let usNe = new UsNe("BVWSSVWA.YA"); + + expect(1, usNe.getFieldValue(UsNeField.PROCESSING_NOTICE)); + expect(1, usNe.getFieldValue(UsNeField.SALE_OPT_OUT_NOTICE)); + expect(1, usNe.getFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE)); + expect(1, usNe.getFieldValue(UsNeField.SALE_OPT_OUT)); + expect(1, usNe.getFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT)); + expect([2, 1, 0, 2, 1, 0, 2, 1], usNe.getFieldValue(UsNeField.SENSITIVE_DATA_PROCESSING)); + expect(1, usNe.getFieldValue(UsNeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS)); + expect(1, usNe.getFieldValue(UsNeField.ADDITIONAL_DATA_PROCESSING_CONSENT)); + expect(1, usNe.getFieldValue(UsNeField.MSPA_COVERED_TRANSACTION)); + expect(1, usNe.getFieldValue(UsNeField.MSPA_OPT_OUT_OPTION_MODE)); + expect(2, usNe.getFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE)); + expect(true, usNe.getFieldValue(UsNeField.GPC)); + expect(true, usNe.getFieldValue(UsNeField.GPC_SEGMENT_INCLUDED)); + }); + + it("should decode BVWSSVWA", (): void => { + let usNe = new UsNe("BVWSSVWA"); + + expect(1, usNe.getFieldValue(UsNeField.PROCESSING_NOTICE)); + expect(1, usNe.getFieldValue(UsNeField.SALE_OPT_OUT_NOTICE)); + expect(1, usNe.getFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE)); + expect(1, usNe.getFieldValue(UsNeField.SALE_OPT_OUT)); + expect(1, usNe.getFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT)); + expect([2, 1, 0, 2, 1, 0, 2, 1], usNe.getFieldValue(UsNeField.SENSITIVE_DATA_PROCESSING)); + expect(1, usNe.getFieldValue(UsNeField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS)); + expect(1, usNe.getFieldValue(UsNeField.ADDITIONAL_DATA_PROCESSING_CONSENT)); + expect(1, usNe.getFieldValue(UsNeField.MSPA_COVERED_TRANSACTION)); + expect(1, usNe.getFieldValue(UsNeField.MSPA_OPT_OUT_OPTION_MODE)); + expect(2, usNe.getFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE)); + expect(false, usNe.getFieldValue(UsNeField.GPC_SEGMENT_INCLUDED)); + }); + + it("should throw Error on garbage", (): void => { + expect(function () { + new UsNe("z").getFieldValue(UsNeField.SALE_OPT_OUT); + }).to.throw("Unable to decode UsNeCoreSegment 'z'"); + }); +}); diff --git a/modules/cmpapi/test/encoder/section/UsNh.test.ts b/modules/cmpapi/test/encoder/section/UsNh.test.ts new file mode 100644 index 0000000..4231461 --- /dev/null +++ b/modules/cmpapi/test/encoder/section/UsNh.test.ts @@ -0,0 +1,320 @@ +import { expect } from "chai"; +import { UsNhField } from "../../../src/encoder/field/UsNhField"; +import { UsNh } from "../../../src/encoder/section/UsNh"; + +describe("manifest.section.UsNh", (): void => { + it("should encode default to BAAAAABA.QA", (): void => { + let usNh = new UsNh(); + expect(usNh.encode()).to.eql("BAAAAABA.QA"); + }); + + it("should encode to BVWSSZFY.YA", (): void => { + let usNh = new UsNh(); + + usNh.setFieldValue(UsNhField.PROCESSING_NOTICE, 1); + usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 1); + usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); + usNh.setFieldValue(UsNhField.SALE_OPT_OUT, 1); + usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT, 1); + usNh.setFieldValue(UsNhField.SENSITIVE_DATA_PROCESSING, [2, 1, 0, 2, 1, 0, 2, 1]); + usNh.setFieldValue(UsNhField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, [2, 1, 0]); + usNh.setFieldValue(UsNhField.ADDITIONAL_DATA_PROCESSING_CONSENT, 1); + usNh.setFieldValue(UsNhField.MSPA_COVERED_TRANSACTION, 1); + usNh.setFieldValue(UsNhField.MSPA_OPT_OUT_OPTION_MODE, 1); + usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 2); + usNh.setFieldValue(UsNhField.GPC, true); + + expect(usNh.encode()).to.eql("BVWSSZFY.YA"); + }); + + it("should encode default to BAAAAABA", (): void => { + let usNh = new UsNh(); + usNh.setFieldValue(UsNhField.GPC_SEGMENT_INCLUDED, false); + expect(usNh.encode()).to.eql("BAAAAABA"); + }); + + it("should throw an error if invalid values are set", (): void => { + let usNh = new UsNh(); + + expect(function () { + usNh.setFieldValue(UsNhField.PROCESSING_NOTICE, 3); + }).to.throw(); + + expect(function () { + usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 3); + }).to.throw(); + + expect(function () { + usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 3); + }).to.throw(); + + expect(function () { + usNh.setFieldValue(UsNhField.SALE_OPT_OUT, 3); + }).to.throw(); + + expect(function () { + usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT, -1); + }).to.throw(); + + expect(function () { + usNh.setFieldValue(UsNhField.SENSITIVE_DATA_PROCESSING, [0, 1, 2, 3, 1, 2, 0, 1]); + }).to.throw(); + + expect(function () { + usNh.setFieldValue(UsNhField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, [1, 2, 3]); + }).to.throw(); + + expect(function () { + usNh.setFieldValue(UsNhField.ADDITIONAL_DATA_PROCESSING_CONSENT, 3); + }).to.throw(); + + expect(function () { + usNh.setFieldValue(UsNhField.MSPA_COVERED_TRANSACTION, 0); + }).to.throw(); + + expect(function () { + usNh.setFieldValue(UsNhField.MSPA_OPT_OUT_OPTION_MODE, 4); + }).to.throw(); + + expect(function () { + usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, -1); + }).to.throw(); + }); + + it("should validate sale", (): void => { + let usNh = new UsNh(); + + expect(function () { + usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 0); + usNh.setFieldValue(UsNhField.SALE_OPT_OUT, 1); + usNh.encode(); + }).to.throw(); + + expect(function () { + usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 0); + usNh.setFieldValue(UsNhField.SALE_OPT_OUT, 2); + usNh.encode(); + }).to.throw(); + + expect(function () { + usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 1); + usNh.setFieldValue(UsNhField.SALE_OPT_OUT, 0); + usNh.encode(); + }).to.throw(); + + expect(function () { + usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 2); + usNh.setFieldValue(UsNhField.SALE_OPT_OUT, 0); + usNh.encode(); + }).to.throw(); + + expect(function () { + usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 2); + usNh.setFieldValue(UsNhField.SALE_OPT_OUT, 2); + usNh.encode(); + }).to.throw(); + + usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 0); + usNh.setFieldValue(UsNhField.SALE_OPT_OUT, 0); + usNh.encode(); + + usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 1); + usNh.setFieldValue(UsNhField.SALE_OPT_OUT, 1); + usNh.encode(); + + usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 1); + usNh.setFieldValue(UsNhField.SALE_OPT_OUT, 2); + usNh.encode(); + + usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 2); + usNh.setFieldValue(UsNhField.SALE_OPT_OUT, 1); + usNh.encode(); + }); + + it("should validate targeted advertising", (): void => { + let usNh = new UsNh(); + + expect(function () { + usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); + usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT, 1); + usNh.encode(); + }).to.throw(); + + expect(function () { + usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); + usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT, 2); + usNh.encode(); + }).to.throw(); + + expect(function () { + usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); + usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT, 0); + usNh.encode(); + }).to.throw(); + + expect(function () { + usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); + usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT, 0); + usNh.encode(); + }).to.throw(); + + expect(function () { + usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); + usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT, 2); + usNh.encode(); + }).to.throw(); + + usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); + usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT, 0); + usNh.encode(); + + usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); + usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT, 1); + usNh.encode(); + + usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); + usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT, 2); + usNh.encode(); + + usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); + usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT, 1); + usNh.encode(); + }); + + it("should validate mspa", (): void => { + let usNh = new UsNh(); + + expect(function () { + usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 1); + usNh.setFieldValue(UsNhField.MSPA_OPT_OUT_OPTION_MODE, 0); + usNh.encode(); + }).to.throw(); + + expect(function () { + usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 1); + usNh.setFieldValue(UsNhField.MSPA_OPT_OUT_OPTION_MODE, 1); + usNh.encode(); + }).to.throw(); + + expect(function () { + usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 2); + usNh.setFieldValue(UsNhField.MSPA_OPT_OUT_OPTION_MODE, 0); + usNh.encode(); + }).to.throw(); + + expect(function () { + usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 2); + usNh.setFieldValue(UsNhField.MSPA_OPT_OUT_OPTION_MODE, 2); + usNh.encode(); + }).to.throw(); + + expect(function () { + usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 0); + usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 1); + usNh.encode(); + }).to.throw(); + + expect(function () { + usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 0); + usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 2); + usNh.encode(); + }).to.throw(); + + expect(function () { + usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 1); + usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 1); + usNh.encode(); + }).to.throw(); + + expect(function () { + usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 1); + usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 2); + usNh.encode(); + }).to.throw(); + + usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 0); + + usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 0); + usNh.setFieldValue(UsNhField.MSPA_OPT_OUT_OPTION_MODE, 0); + usNh.encode(); + + usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 0); + usNh.setFieldValue(UsNhField.MSPA_OPT_OUT_OPTION_MODE, 1); + usNh.encode(); + + usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 0); + usNh.setFieldValue(UsNhField.MSPA_OPT_OUT_OPTION_MODE, 2); + usNh.encode(); + + usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 1); + usNh.setFieldValue(UsNhField.MSPA_OPT_OUT_OPTION_MODE, 2); + usNh.encode(); + + usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 2); + usNh.setFieldValue(UsNhField.MSPA_OPT_OUT_OPTION_MODE, 1); + usNh.encode(); + + usNh.setFieldValue(UsNhField.MSPA_OPT_OUT_OPTION_MODE, 0); + + usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 0); + usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 0); + usNh.encode(); + + usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 1); + usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 0); + usNh.encode(); + + usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 2); + usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 0); + usNh.encode(); + + usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 2); + usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 1); + usNh.encode(); + + usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 2); + usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 2); + usNh.encode(); + }); + + it("should decode BVWSSZFY.YA", (): void => { + let usNh = new UsNh("BVWSSZFY.YA"); + + expect(1, usNh.getFieldValue(UsNhField.PROCESSING_NOTICE)); + expect(1, usNh.getFieldValue(UsNhField.SALE_OPT_OUT_NOTICE)); + expect(1, usNh.getFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE)); + expect(1, usNh.getFieldValue(UsNhField.SALE_OPT_OUT)); + expect(1, usNh.getFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT)); + expect([2, 1, 0, 2, 1, 0, 2, 1], usNh.getFieldValue(UsNhField.SENSITIVE_DATA_PROCESSING)); + expect([2, 1, 0], usNh.getFieldValue(UsNhField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS)); + expect(1, usNh.getFieldValue(UsNhField.ADDITIONAL_DATA_PROCESSING_CONSENT)); + expect(1, usNh.getFieldValue(UsNhField.MSPA_COVERED_TRANSACTION)); + expect(1, usNh.getFieldValue(UsNhField.MSPA_OPT_OUT_OPTION_MODE)); + expect(2, usNh.getFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE)); + expect(true, usNh.getFieldValue(UsNhField.GPC)); + expect(true, usNh.getFieldValue(UsNhField.GPC_SEGMENT_INCLUDED)); + }); + + it("should decode BVWSSZFY", (): void => { + let usNh = new UsNh("BVWSSZFY"); + + expect(1, usNh.getFieldValue(UsNhField.PROCESSING_NOTICE)); + expect(1, usNh.getFieldValue(UsNhField.SALE_OPT_OUT_NOTICE)); + expect(1, usNh.getFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE)); + expect(1, usNh.getFieldValue(UsNhField.SALE_OPT_OUT)); + expect(1, usNh.getFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT)); + expect([2, 1, 0, 2, 1, 0, 2, 1], usNh.getFieldValue(UsNhField.SENSITIVE_DATA_PROCESSING)); + expect([2, 1, 0], usNh.getFieldValue(UsNhField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS)); + expect(1, usNh.getFieldValue(UsNhField.ADDITIONAL_DATA_PROCESSING_CONSENT)); + expect(1, usNh.getFieldValue(UsNhField.MSPA_COVERED_TRANSACTION)); + expect(1, usNh.getFieldValue(UsNhField.MSPA_OPT_OUT_OPTION_MODE)); + expect(2, usNh.getFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE)); + expect(false, usNh.getFieldValue(UsNhField.GPC_SEGMENT_INCLUDED)); + }); + + it("should throw Error on garbage", (): void => { + expect(function () { + new UsNh("z").getFieldValue(UsNhField.SALE_OPT_OUT); + }).to.throw("Unable to decode UsNhCoreSegment 'z'"); + }); +}); diff --git a/modules/cmpapi/test/encoder/section/UsNj.test.ts b/modules/cmpapi/test/encoder/section/UsNj.test.ts new file mode 100644 index 0000000..75d068d --- /dev/null +++ b/modules/cmpapi/test/encoder/section/UsNj.test.ts @@ -0,0 +1,320 @@ +import { expect } from "chai"; +import { UsNjField } from "../../../src/encoder/field/UsNjField"; +import { UsNj } from "../../../src/encoder/section/UsNj"; + +describe("manifest.section.UsNj", (): void => { + it("should encode default to BAAAAAAAQA.QA", (): void => { + let usNj = new UsNj(); + expect(usNj.encode()).to.eql("BAAAAAAAQA.QA"); + }); + + it("should encode to BVWSSRklWA.YA", (): void => { + let usNj = new UsNj(); + + usNj.setFieldValue(UsNjField.PROCESSING_NOTICE, 1); + usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 1); + usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); + usNj.setFieldValue(UsNjField.SALE_OPT_OUT, 1); + usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT, 1); + usNj.setFieldValue(UsNjField.SENSITIVE_DATA_PROCESSING, [2, 1, 0, 2, 1, 0, 2, 1, 0, 1]); + usNj.setFieldValue(UsNjField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, [2, 1, 0, 2, 1]); + usNj.setFieldValue(UsNjField.ADDITIONAL_DATA_PROCESSING_CONSENT, 1); + usNj.setFieldValue(UsNjField.MSPA_COVERED_TRANSACTION, 1); + usNj.setFieldValue(UsNjField.MSPA_OPT_OUT_OPTION_MODE, 1); + usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 2); + usNj.setFieldValue(UsNjField.GPC, true); + + expect(usNj.encode()).to.eql("BVWSSRklWA.YA"); + }); + + it("should encode default to BAAAAAAAQA", (): void => { + let usNj = new UsNj(); + usNj.setFieldValue(UsNjField.GPC_SEGMENT_INCLUDED, false); + expect(usNj.encode()).to.eql("BAAAAAAAQA"); + }); + + it("should throw an error if invalid values are set", (): void => { + let usNj = new UsNj(); + + expect(function () { + usNj.setFieldValue(UsNjField.PROCESSING_NOTICE, 3); + }).to.throw(); + + expect(function () { + usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 3); + }).to.throw(); + + expect(function () { + usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 3); + }).to.throw(); + + expect(function () { + usNj.setFieldValue(UsNjField.SALE_OPT_OUT, 3); + }).to.throw(); + + expect(function () { + usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT, -1); + }).to.throw(); + + expect(function () { + usNj.setFieldValue(UsNjField.SENSITIVE_DATA_PROCESSING, [0, 1, 2, 3, 1, 2, 0, 1]); + }).to.throw(); + + expect(function () { + usNj.setFieldValue(UsNjField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, [1, 2, 3]); + }).to.throw(); + + expect(function () { + usNj.setFieldValue(UsNjField.ADDITIONAL_DATA_PROCESSING_CONSENT, 3); + }).to.throw(); + + expect(function () { + usNj.setFieldValue(UsNjField.MSPA_COVERED_TRANSACTION, 0); + }).to.throw(); + + expect(function () { + usNj.setFieldValue(UsNjField.MSPA_OPT_OUT_OPTION_MODE, 4); + }).to.throw(); + + expect(function () { + usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, -1); + }).to.throw(); + }); + + it("should validate sale", (): void => { + let usNj = new UsNj(); + + expect(function () { + usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 0); + usNj.setFieldValue(UsNjField.SALE_OPT_OUT, 1); + usNj.encode(); + }).to.throw(); + + expect(function () { + usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 0); + usNj.setFieldValue(UsNjField.SALE_OPT_OUT, 2); + usNj.encode(); + }).to.throw(); + + expect(function () { + usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 1); + usNj.setFieldValue(UsNjField.SALE_OPT_OUT, 0); + usNj.encode(); + }).to.throw(); + + expect(function () { + usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 2); + usNj.setFieldValue(UsNjField.SALE_OPT_OUT, 0); + usNj.encode(); + }).to.throw(); + + expect(function () { + usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 2); + usNj.setFieldValue(UsNjField.SALE_OPT_OUT, 2); + usNj.encode(); + }).to.throw(); + + usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 0); + usNj.setFieldValue(UsNjField.SALE_OPT_OUT, 0); + usNj.encode(); + + usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 1); + usNj.setFieldValue(UsNjField.SALE_OPT_OUT, 1); + usNj.encode(); + + usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 1); + usNj.setFieldValue(UsNjField.SALE_OPT_OUT, 2); + usNj.encode(); + + usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 2); + usNj.setFieldValue(UsNjField.SALE_OPT_OUT, 1); + usNj.encode(); + }); + + it("should validate targeted advertising", (): void => { + let usNj = new UsNj(); + + expect(function () { + usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); + usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT, 1); + usNj.encode(); + }).to.throw(); + + expect(function () { + usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); + usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT, 2); + usNj.encode(); + }).to.throw(); + + expect(function () { + usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); + usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT, 0); + usNj.encode(); + }).to.throw(); + + expect(function () { + usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); + usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT, 0); + usNj.encode(); + }).to.throw(); + + expect(function () { + usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); + usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT, 2); + usNj.encode(); + }).to.throw(); + + usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); + usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT, 0); + usNj.encode(); + + usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); + usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT, 1); + usNj.encode(); + + usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); + usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT, 2); + usNj.encode(); + + usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); + usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT, 1); + usNj.encode(); + }); + + it("should validate mspa", (): void => { + let usNj = new UsNj(); + + expect(function () { + usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 1); + usNj.setFieldValue(UsNjField.MSPA_OPT_OUT_OPTION_MODE, 0); + usNj.encode(); + }).to.throw(); + + expect(function () { + usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 1); + usNj.setFieldValue(UsNjField.MSPA_OPT_OUT_OPTION_MODE, 1); + usNj.encode(); + }).to.throw(); + + expect(function () { + usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 2); + usNj.setFieldValue(UsNjField.MSPA_OPT_OUT_OPTION_MODE, 0); + usNj.encode(); + }).to.throw(); + + expect(function () { + usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 2); + usNj.setFieldValue(UsNjField.MSPA_OPT_OUT_OPTION_MODE, 2); + usNj.encode(); + }).to.throw(); + + expect(function () { + usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 0); + usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 1); + usNj.encode(); + }).to.throw(); + + expect(function () { + usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 0); + usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 2); + usNj.encode(); + }).to.throw(); + + expect(function () { + usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 1); + usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 1); + usNj.encode(); + }).to.throw(); + + expect(function () { + usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 1); + usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 2); + usNj.encode(); + }).to.throw(); + + usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 0); + + usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 0); + usNj.setFieldValue(UsNjField.MSPA_OPT_OUT_OPTION_MODE, 0); + usNj.encode(); + + usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 0); + usNj.setFieldValue(UsNjField.MSPA_OPT_OUT_OPTION_MODE, 1); + usNj.encode(); + + usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 0); + usNj.setFieldValue(UsNjField.MSPA_OPT_OUT_OPTION_MODE, 2); + usNj.encode(); + + usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 1); + usNj.setFieldValue(UsNjField.MSPA_OPT_OUT_OPTION_MODE, 2); + usNj.encode(); + + usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 2); + usNj.setFieldValue(UsNjField.MSPA_OPT_OUT_OPTION_MODE, 1); + usNj.encode(); + + usNj.setFieldValue(UsNjField.MSPA_OPT_OUT_OPTION_MODE, 0); + + usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 0); + usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 0); + usNj.encode(); + + usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 1); + usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 0); + usNj.encode(); + + usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 2); + usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 0); + usNj.encode(); + + usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 2); + usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 1); + usNj.encode(); + + usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 2); + usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 2); + usNj.encode(); + }); + + it("should decode BVWSSRklWA.YA", (): void => { + let usNj = new UsNj("BVWSSRklWA.YA"); + + expect(1, usNj.getFieldValue(UsNjField.PROCESSING_NOTICE)); + expect(1, usNj.getFieldValue(UsNjField.SALE_OPT_OUT_NOTICE)); + expect(1, usNj.getFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE)); + expect(1, usNj.getFieldValue(UsNjField.SALE_OPT_OUT)); + expect(1, usNj.getFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT)); + expect([2, 1, 0, 2, 1, 0, 2, 1, 0, 1], usNj.getFieldValue(UsNjField.SENSITIVE_DATA_PROCESSING)); + expect([2, 1, 0, 2, 1], usNj.getFieldValue(UsNjField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS)); + expect(1, usNj.getFieldValue(UsNjField.ADDITIONAL_DATA_PROCESSING_CONSENT)); + expect(1, usNj.getFieldValue(UsNjField.MSPA_COVERED_TRANSACTION)); + expect(1, usNj.getFieldValue(UsNjField.MSPA_OPT_OUT_OPTION_MODE)); + expect(2, usNj.getFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE)); + expect(true, usNj.getFieldValue(UsNjField.GPC)); + expect(true, usNj.getFieldValue(UsNjField.GPC_SEGMENT_INCLUDED)); + }); + + it("should decode BVWSSRklWA", (): void => { + let usNj = new UsNj("BVWSSRklWA"); + + expect(1, usNj.getFieldValue(UsNjField.PROCESSING_NOTICE)); + expect(1, usNj.getFieldValue(UsNjField.SALE_OPT_OUT_NOTICE)); + expect(1, usNj.getFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE)); + expect(1, usNj.getFieldValue(UsNjField.SALE_OPT_OUT)); + expect(1, usNj.getFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT)); + expect([2, 1, 0, 2, 1, 0, 2, 1, 0, 1], usNj.getFieldValue(UsNjField.SENSITIVE_DATA_PROCESSING)); + expect([2, 1, 0, 2, 1], usNj.getFieldValue(UsNjField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS)); + expect(1, usNj.getFieldValue(UsNjField.ADDITIONAL_DATA_PROCESSING_CONSENT)); + expect(1, usNj.getFieldValue(UsNjField.MSPA_COVERED_TRANSACTION)); + expect(1, usNj.getFieldValue(UsNjField.MSPA_OPT_OUT_OPTION_MODE)); + expect(2, usNj.getFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE)); + expect(false, usNj.getFieldValue(UsNjField.GPC_SEGMENT_INCLUDED)); + }); + + it("should throw Error on garbage", (): void => { + expect(function () { + new UsNj("z").getFieldValue(UsNjField.SALE_OPT_OUT); + }).to.throw("Unable to decode UsNjCoreSegment 'z'"); + }); +}); diff --git a/modules/cmpapi/test/encoder/section/UsTn.test.ts b/modules/cmpapi/test/encoder/section/UsTn.test.ts new file mode 100644 index 0000000..e1083be --- /dev/null +++ b/modules/cmpapi/test/encoder/section/UsTn.test.ts @@ -0,0 +1,320 @@ +import { expect } from "chai"; +import { UsTnField } from "../../../src/encoder/field/UsTnField"; +import { UsTn } from "../../../src/encoder/section/UsTn"; + +describe("manifest.section.UsTn", (): void => { + it("should encode default to BAAAAAQA.QA", (): void => { + let usTn = new UsTn(); + expect(usTn.encode()).to.eql("BAAAAAQA.QA"); + }); + + it("should encode to BVWSSVWA.YA", (): void => { + let usTn = new UsTn(); + + usTn.setFieldValue(UsTnField.PROCESSING_NOTICE, 1); + usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 1); + usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); + usTn.setFieldValue(UsTnField.SALE_OPT_OUT, 1); + usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT, 1); + usTn.setFieldValue(UsTnField.SENSITIVE_DATA_PROCESSING, [2, 1, 0, 2, 1, 0, 2, 1]); + usTn.setFieldValue(UsTnField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, 1); + usTn.setFieldValue(UsTnField.ADDITIONAL_DATA_PROCESSING_CONSENT, 1); + usTn.setFieldValue(UsTnField.MSPA_COVERED_TRANSACTION, 1); + usTn.setFieldValue(UsTnField.MSPA_OPT_OUT_OPTION_MODE, 1); + usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 2); + usTn.setFieldValue(UsTnField.GPC, true); + + expect(usTn.encode()).to.eql("BVWSSVWA.YA"); + }); + + it("should encode default to BAAAAAQA", (): void => { + let usTn = new UsTn(); + usTn.setFieldValue(UsTnField.GPC_SEGMENT_INCLUDED, false); + expect(usTn.encode()).to.eql("BAAAAAQA"); + }); + + it("should throw an error if invalid values are set", (): void => { + let usTn = new UsTn(); + + expect(function () { + usTn.setFieldValue(UsTnField.PROCESSING_NOTICE, 3); + }).to.throw(); + + expect(function () { + usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 3); + }).to.throw(); + + expect(function () { + usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 3); + }).to.throw(); + + expect(function () { + usTn.setFieldValue(UsTnField.SALE_OPT_OUT, 3); + }).to.throw(); + + expect(function () { + usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT, -1); + }).to.throw(); + + expect(function () { + usTn.setFieldValue(UsTnField.SENSITIVE_DATA_PROCESSING, [0, 1, 2, 3, 1, 2, 0, 1]); + }).to.throw(); + + expect(function () { + usTn.setFieldValue(UsTnField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS, [1, 2, 3]); + }).to.throw(); + + expect(function () { + usTn.setFieldValue(UsTnField.ADDITIONAL_DATA_PROCESSING_CONSENT, 3); + }).to.throw(); + + expect(function () { + usTn.setFieldValue(UsTnField.MSPA_COVERED_TRANSACTION, 0); + }).to.throw(); + + expect(function () { + usTn.setFieldValue(UsTnField.MSPA_OPT_OUT_OPTION_MODE, 4); + }).to.throw(); + + expect(function () { + usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, -1); + }).to.throw(); + }); + + it("should validate sale", (): void => { + let usTn = new UsTn(); + + expect(function () { + usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 0); + usTn.setFieldValue(UsTnField.SALE_OPT_OUT, 1); + usTn.encode(); + }).to.throw(); + + expect(function () { + usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 0); + usTn.setFieldValue(UsTnField.SALE_OPT_OUT, 2); + usTn.encode(); + }).to.throw(); + + expect(function () { + usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 1); + usTn.setFieldValue(UsTnField.SALE_OPT_OUT, 0); + usTn.encode(); + }).to.throw(); + + expect(function () { + usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 2); + usTn.setFieldValue(UsTnField.SALE_OPT_OUT, 0); + usTn.encode(); + }).to.throw(); + + expect(function () { + usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 2); + usTn.setFieldValue(UsTnField.SALE_OPT_OUT, 2); + usTn.encode(); + }).to.throw(); + + usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 0); + usTn.setFieldValue(UsTnField.SALE_OPT_OUT, 0); + usTn.encode(); + + usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 1); + usTn.setFieldValue(UsTnField.SALE_OPT_OUT, 1); + usTn.encode(); + + usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 1); + usTn.setFieldValue(UsTnField.SALE_OPT_OUT, 2); + usTn.encode(); + + usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 2); + usTn.setFieldValue(UsTnField.SALE_OPT_OUT, 1); + usTn.encode(); + }); + + it("should validate targeted advertising", (): void => { + let usTn = new UsTn(); + + expect(function () { + usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); + usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT, 1); + usTn.encode(); + }).to.throw(); + + expect(function () { + usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); + usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT, 2); + usTn.encode(); + }).to.throw(); + + expect(function () { + usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); + usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT, 0); + usTn.encode(); + }).to.throw(); + + expect(function () { + usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); + usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT, 0); + usTn.encode(); + }).to.throw(); + + expect(function () { + usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); + usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT, 2); + usTn.encode(); + }).to.throw(); + + usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); + usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT, 0); + usTn.encode(); + + usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); + usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT, 1); + usTn.encode(); + + usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); + usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT, 2); + usTn.encode(); + + usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); + usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT, 1); + usTn.encode(); + }); + + it("should validate mspa", (): void => { + let usTn = new UsTn(); + + expect(function () { + usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 1); + usTn.setFieldValue(UsTnField.MSPA_OPT_OUT_OPTION_MODE, 0); + usTn.encode(); + }).to.throw(); + + expect(function () { + usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 1); + usTn.setFieldValue(UsTnField.MSPA_OPT_OUT_OPTION_MODE, 1); + usTn.encode(); + }).to.throw(); + + expect(function () { + usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 2); + usTn.setFieldValue(UsTnField.MSPA_OPT_OUT_OPTION_MODE, 0); + usTn.encode(); + }).to.throw(); + + expect(function () { + usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 2); + usTn.setFieldValue(UsTnField.MSPA_OPT_OUT_OPTION_MODE, 2); + usTn.encode(); + }).to.throw(); + + expect(function () { + usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 0); + usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 1); + usTn.encode(); + }).to.throw(); + + expect(function () { + usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 0); + usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 2); + usTn.encode(); + }).to.throw(); + + expect(function () { + usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 1); + usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 1); + usTn.encode(); + }).to.throw(); + + expect(function () { + usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 1); + usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 2); + usTn.encode(); + }).to.throw(); + + usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 0); + + usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 0); + usTn.setFieldValue(UsTnField.MSPA_OPT_OUT_OPTION_MODE, 0); + usTn.encode(); + + usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 0); + usTn.setFieldValue(UsTnField.MSPA_OPT_OUT_OPTION_MODE, 1); + usTn.encode(); + + usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 0); + usTn.setFieldValue(UsTnField.MSPA_OPT_OUT_OPTION_MODE, 2); + usTn.encode(); + + usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 1); + usTn.setFieldValue(UsTnField.MSPA_OPT_OUT_OPTION_MODE, 2); + usTn.encode(); + + usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 2); + usTn.setFieldValue(UsTnField.MSPA_OPT_OUT_OPTION_MODE, 1); + usTn.encode(); + + usTn.setFieldValue(UsTnField.MSPA_OPT_OUT_OPTION_MODE, 0); + + usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 0); + usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 0); + usTn.encode(); + + usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 1); + usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 0); + usTn.encode(); + + usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 2); + usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 0); + usTn.encode(); + + usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 2); + usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 1); + usTn.encode(); + + usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 2); + usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 2); + usTn.encode(); + }); + + it("should decode BVWSSVWA.YA", (): void => { + let usTn = new UsTn("BVWSSVWA.YA"); + + expect(1, usTn.getFieldValue(UsTnField.PROCESSING_NOTICE)); + expect(1, usTn.getFieldValue(UsTnField.SALE_OPT_OUT_NOTICE)); + expect(1, usTn.getFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE)); + expect(1, usTn.getFieldValue(UsTnField.SALE_OPT_OUT)); + expect(1, usTn.getFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT)); + expect([2, 1, 0, 2, 1, 0, 2, 1], usTn.getFieldValue(UsTnField.SENSITIVE_DATA_PROCESSING)); + expect(1, usTn.getFieldValue(UsTnField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS)); + expect(1, usTn.getFieldValue(UsTnField.ADDITIONAL_DATA_PROCESSING_CONSENT)); + expect(1, usTn.getFieldValue(UsTnField.MSPA_COVERED_TRANSACTION)); + expect(1, usTn.getFieldValue(UsTnField.MSPA_OPT_OUT_OPTION_MODE)); + expect(2, usTn.getFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE)); + expect(true, usTn.getFieldValue(UsTnField.GPC)); + expect(true, usTn.getFieldValue(UsTnField.GPC_SEGMENT_INCLUDED)); + }); + + it("should decode BVWSSVWA", (): void => { + let usTn = new UsTn("BVWSSVWA"); + + expect(1, usTn.getFieldValue(UsTnField.PROCESSING_NOTICE)); + expect(1, usTn.getFieldValue(UsTnField.SALE_OPT_OUT_NOTICE)); + expect(1, usTn.getFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE)); + expect(1, usTn.getFieldValue(UsTnField.SALE_OPT_OUT)); + expect(1, usTn.getFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT)); + expect([2, 1, 0, 2, 1, 0, 2, 1], usTn.getFieldValue(UsTnField.SENSITIVE_DATA_PROCESSING)); + expect(1, usTn.getFieldValue(UsTnField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS)); + expect(1, usTn.getFieldValue(UsTnField.ADDITIONAL_DATA_PROCESSING_CONSENT)); + expect(1, usTn.getFieldValue(UsTnField.MSPA_COVERED_TRANSACTION)); + expect(1, usTn.getFieldValue(UsTnField.MSPA_OPT_OUT_OPTION_MODE)); + expect(2, usTn.getFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE)); + expect(false, usTn.getFieldValue(UsTnField.GPC_SEGMENT_INCLUDED)); + }); + + it("should throw Error on garbage", (): void => { + expect(function () { + new UsTn("z").getFieldValue(UsTnField.SALE_OPT_OUT); + }).to.throw("Unable to decode UsTnCoreSegment 'z'"); + }); +}); From a56301c4b345608ecdb4757e107a95bd9b695ec9 Mon Sep 17 00:00:00 2001 From: Chad Huff Date: Thu, 14 Nov 2024 10:18:03 -0700 Subject: [PATCH 2/3] update README --- README.md | 4 ++-- modules/cmpapi/README.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index aeb41c5..66edb1c 100644 --- a/README.md +++ b/README.md @@ -156,8 +156,8 @@ __gpp("removeEventListener", callback?, parameter?) | usnat | 7 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | | usnat | 7 | SharingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | | usnat | 7 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usnat | 7 | SensitiveDataProcessing | 2 bit int array of size 12. 0=Not applicable, 1=Yes, 2=No | -| usnat | 7 | KnownChildSensitiveDataConsents | 2 bit int array of size 2. 0=Not applicable, 1=Yes, 2=No | +| usnat | 7 | SensitiveDataProcessing | 2 bit int array of size 16. 0=Not applicable, 1=Yes, 2=No | +| usnat | 7 | KnownChildSensitiveDataConsents | 2 bit int array of size 3. 0=Not applicable, 1=Yes, 2=No | | usnat | 7 | PersonalDataConsents | 2 bit int. 0=Not applicable, 1=Yes, 2=No | | usnat | 7 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | | usnat | 7 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | diff --git a/modules/cmpapi/README.md b/modules/cmpapi/README.md index aeb41c5..66edb1c 100644 --- a/modules/cmpapi/README.md +++ b/modules/cmpapi/README.md @@ -156,8 +156,8 @@ __gpp("removeEventListener", callback?, parameter?) | usnat | 7 | SaleOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | | usnat | 7 | SharingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | | usnat | 7 | TargetedAdvertisingOptOut | 2 bit int. 0=Not applicable, 1=Yes, 2=No | -| usnat | 7 | SensitiveDataProcessing | 2 bit int array of size 12. 0=Not applicable, 1=Yes, 2=No | -| usnat | 7 | KnownChildSensitiveDataConsents | 2 bit int array of size 2. 0=Not applicable, 1=Yes, 2=No | +| usnat | 7 | SensitiveDataProcessing | 2 bit int array of size 16. 0=Not applicable, 1=Yes, 2=No | +| usnat | 7 | KnownChildSensitiveDataConsents | 2 bit int array of size 3. 0=Not applicable, 1=Yes, 2=No | | usnat | 7 | PersonalDataConsents | 2 bit int. 0=Not applicable, 1=Yes, 2=No | | usnat | 7 | MspaCoveredTransaction | 2 bit int. 0=Not applicable, 1=Yes, 2=No | | usnat | 7 | MspaOptOutOptionMode | 2 bit int. 0=Not applicable, 1=Yes, 2=No | From a7b2d911153e402623df83481426c9003cd4c13d Mon Sep 17 00:00:00 2001 From: Chad Huff Date: Sat, 16 Nov 2024 09:32:06 -0700 Subject: [PATCH 3/3] remove validation --- .../src/encoder/segment/UsDeCoreSegment.ts | 106 ---------- .../src/encoder/segment/UsIaCoreSegment.ts | 106 ---------- .../src/encoder/segment/UsNeCoreSegment.ts | 106 ---------- .../src/encoder/segment/UsNhCoreSegment.ts | 106 ---------- .../src/encoder/segment/UsNjCoreSegment.ts | 106 ---------- .../src/encoder/segment/UsTnCoreSegment.ts | 106 ---------- .../cmpapi/test/encoder/section/UsDe.test.ts | 196 ------------------ .../cmpapi/test/encoder/section/UsIa.test.ts | 196 ------------------ .../cmpapi/test/encoder/section/UsNe.test.ts | 196 ------------------ .../cmpapi/test/encoder/section/UsNh.test.ts | 196 ------------------ .../cmpapi/test/encoder/section/UsNj.test.ts | 196 ------------------ .../cmpapi/test/encoder/section/UsTn.test.ts | 196 ------------------ 12 files changed, 1812 deletions(-) diff --git a/modules/cmpapi/src/encoder/segment/UsDeCoreSegment.ts b/modules/cmpapi/src/encoder/segment/UsDeCoreSegment.ts index d008a6f..605dac3 100644 --- a/modules/cmpapi/src/encoder/segment/UsDeCoreSegment.ts +++ b/modules/cmpapi/src/encoder/segment/UsDeCoreSegment.ts @@ -123,110 +123,4 @@ export class UsDeCoreSegment extends AbstractLazilyEncodableSegment { }).to.throw(); }); - it("should validate sale", (): void => { - let usDe = new UsDe(); - - expect(function () { - usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 0); - usDe.setFieldValue(UsDeField.SALE_OPT_OUT, 1); - usDe.encode(); - }).to.throw(); - - expect(function () { - usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 0); - usDe.setFieldValue(UsDeField.SALE_OPT_OUT, 2); - usDe.encode(); - }).to.throw(); - - expect(function () { - usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 1); - usDe.setFieldValue(UsDeField.SALE_OPT_OUT, 0); - usDe.encode(); - }).to.throw(); - - expect(function () { - usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 2); - usDe.setFieldValue(UsDeField.SALE_OPT_OUT, 0); - usDe.encode(); - }).to.throw(); - - expect(function () { - usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 2); - usDe.setFieldValue(UsDeField.SALE_OPT_OUT, 2); - usDe.encode(); - }).to.throw(); - - usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 0); - usDe.setFieldValue(UsDeField.SALE_OPT_OUT, 0); - usDe.encode(); - - usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 1); - usDe.setFieldValue(UsDeField.SALE_OPT_OUT, 1); - usDe.encode(); - - usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 1); - usDe.setFieldValue(UsDeField.SALE_OPT_OUT, 2); - usDe.encode(); - - usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 2); - usDe.setFieldValue(UsDeField.SALE_OPT_OUT, 1); - usDe.encode(); - }); - - it("should validate targeted advertising", (): void => { - let usDe = new UsDe(); - - expect(function () { - usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); - usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT, 1); - usDe.encode(); - }).to.throw(); - - expect(function () { - usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); - usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT, 2); - usDe.encode(); - }).to.throw(); - - expect(function () { - usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); - usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT, 0); - usDe.encode(); - }).to.throw(); - - expect(function () { - usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); - usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT, 0); - usDe.encode(); - }).to.throw(); - - expect(function () { - usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); - usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT, 2); - usDe.encode(); - }).to.throw(); - - usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); - usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT, 0); - usDe.encode(); - - usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); - usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT, 1); - usDe.encode(); - - usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); - usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT, 2); - usDe.encode(); - - usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); - usDe.setFieldValue(UsDeField.TARGETED_ADVERTISING_OPT_OUT, 1); - usDe.encode(); - }); - - it("should validate mspa", (): void => { - let usDe = new UsDe(); - - expect(function () { - usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 1); - usDe.setFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE, 0); - usDe.encode(); - }).to.throw(); - - expect(function () { - usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 1); - usDe.setFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE, 1); - usDe.encode(); - }).to.throw(); - - expect(function () { - usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 2); - usDe.setFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE, 0); - usDe.encode(); - }).to.throw(); - - expect(function () { - usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 2); - usDe.setFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE, 2); - usDe.encode(); - }).to.throw(); - - expect(function () { - usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 0); - usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 1); - usDe.encode(); - }).to.throw(); - - expect(function () { - usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 0); - usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 2); - usDe.encode(); - }).to.throw(); - - expect(function () { - usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 1); - usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 1); - usDe.encode(); - }).to.throw(); - - expect(function () { - usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 1); - usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 2); - usDe.encode(); - }).to.throw(); - - usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 0); - - usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 0); - usDe.setFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE, 0); - usDe.encode(); - - usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 0); - usDe.setFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE, 1); - usDe.encode(); - - usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 0); - usDe.setFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE, 2); - usDe.encode(); - - usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 1); - usDe.setFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE, 2); - usDe.encode(); - - usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 2); - usDe.setFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE, 1); - usDe.encode(); - - usDe.setFieldValue(UsDeField.MSPA_OPT_OUT_OPTION_MODE, 0); - - usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 0); - usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 0); - usDe.encode(); - - usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 1); - usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 0); - usDe.encode(); - - usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 2); - usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 0); - usDe.encode(); - - usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 2); - usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 1); - usDe.encode(); - - usDe.setFieldValue(UsDeField.MSPA_SERVICE_PROVIDER_MODE, 2); - usDe.setFieldValue(UsDeField.SALE_OPT_OUT_NOTICE, 2); - usDe.encode(); - }); - it("should decode BVWSSSSVYA.YA", (): void => { let usDe = new UsDe("BVWSSSSVYA.YA"); diff --git a/modules/cmpapi/test/encoder/section/UsIa.test.ts b/modules/cmpapi/test/encoder/section/UsIa.test.ts index 5fe4678..85ac66b 100644 --- a/modules/cmpapi/test/encoder/section/UsIa.test.ts +++ b/modules/cmpapi/test/encoder/section/UsIa.test.ts @@ -81,202 +81,6 @@ describe("manifest.section.UsIa", (): void => { }).to.throw(); }); - it("should validate sale", (): void => { - let usIa = new UsIa(); - - expect(function () { - usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 0); - usIa.setFieldValue(UsIaField.SALE_OPT_OUT, 1); - usIa.encode(); - }).to.throw(); - - expect(function () { - usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 0); - usIa.setFieldValue(UsIaField.SALE_OPT_OUT, 2); - usIa.encode(); - }).to.throw(); - - expect(function () { - usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 1); - usIa.setFieldValue(UsIaField.SALE_OPT_OUT, 0); - usIa.encode(); - }).to.throw(); - - expect(function () { - usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 2); - usIa.setFieldValue(UsIaField.SALE_OPT_OUT, 0); - usIa.encode(); - }).to.throw(); - - expect(function () { - usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 2); - usIa.setFieldValue(UsIaField.SALE_OPT_OUT, 2); - usIa.encode(); - }).to.throw(); - - usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 0); - usIa.setFieldValue(UsIaField.SALE_OPT_OUT, 0); - usIa.encode(); - - usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 1); - usIa.setFieldValue(UsIaField.SALE_OPT_OUT, 1); - usIa.encode(); - - usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 1); - usIa.setFieldValue(UsIaField.SALE_OPT_OUT, 2); - usIa.encode(); - - usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 2); - usIa.setFieldValue(UsIaField.SALE_OPT_OUT, 1); - usIa.encode(); - }); - - it("should validate targeted advertising", (): void => { - let usIa = new UsIa(); - - expect(function () { - usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); - usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT, 1); - usIa.encode(); - }).to.throw(); - - expect(function () { - usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); - usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT, 2); - usIa.encode(); - }).to.throw(); - - expect(function () { - usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); - usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT, 0); - usIa.encode(); - }).to.throw(); - - expect(function () { - usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); - usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT, 0); - usIa.encode(); - }).to.throw(); - - expect(function () { - usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); - usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT, 2); - usIa.encode(); - }).to.throw(); - - usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); - usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT, 0); - usIa.encode(); - - usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); - usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT, 1); - usIa.encode(); - - usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); - usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT, 2); - usIa.encode(); - - usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); - usIa.setFieldValue(UsIaField.TARGETED_ADVERTISING_OPT_OUT, 1); - usIa.encode(); - }); - - it("should validate mspa", (): void => { - let usIa = new UsIa(); - - expect(function () { - usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 1); - usIa.setFieldValue(UsIaField.MSPA_OPT_OUT_OPTION_MODE, 0); - usIa.encode(); - }).to.throw(); - - expect(function () { - usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 1); - usIa.setFieldValue(UsIaField.MSPA_OPT_OUT_OPTION_MODE, 1); - usIa.encode(); - }).to.throw(); - - expect(function () { - usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 2); - usIa.setFieldValue(UsIaField.MSPA_OPT_OUT_OPTION_MODE, 0); - usIa.encode(); - }).to.throw(); - - expect(function () { - usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 2); - usIa.setFieldValue(UsIaField.MSPA_OPT_OUT_OPTION_MODE, 2); - usIa.encode(); - }).to.throw(); - - expect(function () { - usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 0); - usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 1); - usIa.encode(); - }).to.throw(); - - expect(function () { - usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 0); - usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 2); - usIa.encode(); - }).to.throw(); - - expect(function () { - usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 1); - usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 1); - usIa.encode(); - }).to.throw(); - - expect(function () { - usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 1); - usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 2); - usIa.encode(); - }).to.throw(); - - usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 0); - - usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 0); - usIa.setFieldValue(UsIaField.MSPA_OPT_OUT_OPTION_MODE, 0); - usIa.encode(); - - usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 0); - usIa.setFieldValue(UsIaField.MSPA_OPT_OUT_OPTION_MODE, 1); - usIa.encode(); - - usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 0); - usIa.setFieldValue(UsIaField.MSPA_OPT_OUT_OPTION_MODE, 2); - usIa.encode(); - - usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 1); - usIa.setFieldValue(UsIaField.MSPA_OPT_OUT_OPTION_MODE, 2); - usIa.encode(); - - usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 2); - usIa.setFieldValue(UsIaField.MSPA_OPT_OUT_OPTION_MODE, 1); - usIa.encode(); - - usIa.setFieldValue(UsIaField.MSPA_OPT_OUT_OPTION_MODE, 0); - - usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 0); - usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 0); - usIa.encode(); - - usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 1); - usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 0); - usIa.encode(); - - usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 2); - usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 0); - usIa.encode(); - - usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 2); - usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 1); - usIa.encode(); - - usIa.setFieldValue(UsIaField.MSPA_SERVICE_PROVIDER_MODE, 2); - usIa.setFieldValue(UsIaField.SALE_OPT_OUT_NOTICE, 2); - usIa.encode(); - }); - it("should decode BVVkklWA.YA", (): void => { let usIa = new UsIa("BVVkklWA.YA"); diff --git a/modules/cmpapi/test/encoder/section/UsNe.test.ts b/modules/cmpapi/test/encoder/section/UsNe.test.ts index 98631b5..9d108f1 100644 --- a/modules/cmpapi/test/encoder/section/UsNe.test.ts +++ b/modules/cmpapi/test/encoder/section/UsNe.test.ts @@ -81,202 +81,6 @@ describe("manifest.section.UsNe", (): void => { }).to.throw(); }); - it("should validate sale", (): void => { - let usNe = new UsNe(); - - expect(function () { - usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 0); - usNe.setFieldValue(UsNeField.SALE_OPT_OUT, 1); - usNe.encode(); - }).to.throw(); - - expect(function () { - usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 0); - usNe.setFieldValue(UsNeField.SALE_OPT_OUT, 2); - usNe.encode(); - }).to.throw(); - - expect(function () { - usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 1); - usNe.setFieldValue(UsNeField.SALE_OPT_OUT, 0); - usNe.encode(); - }).to.throw(); - - expect(function () { - usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 2); - usNe.setFieldValue(UsNeField.SALE_OPT_OUT, 0); - usNe.encode(); - }).to.throw(); - - expect(function () { - usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 2); - usNe.setFieldValue(UsNeField.SALE_OPT_OUT, 2); - usNe.encode(); - }).to.throw(); - - usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 0); - usNe.setFieldValue(UsNeField.SALE_OPT_OUT, 0); - usNe.encode(); - - usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 1); - usNe.setFieldValue(UsNeField.SALE_OPT_OUT, 1); - usNe.encode(); - - usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 1); - usNe.setFieldValue(UsNeField.SALE_OPT_OUT, 2); - usNe.encode(); - - usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 2); - usNe.setFieldValue(UsNeField.SALE_OPT_OUT, 1); - usNe.encode(); - }); - - it("should validate targeted advertising", (): void => { - let usNe = new UsNe(); - - expect(function () { - usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); - usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT, 1); - usNe.encode(); - }).to.throw(); - - expect(function () { - usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); - usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT, 2); - usNe.encode(); - }).to.throw(); - - expect(function () { - usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); - usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT, 0); - usNe.encode(); - }).to.throw(); - - expect(function () { - usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); - usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT, 0); - usNe.encode(); - }).to.throw(); - - expect(function () { - usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); - usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT, 2); - usNe.encode(); - }).to.throw(); - - usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); - usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT, 0); - usNe.encode(); - - usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); - usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT, 1); - usNe.encode(); - - usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); - usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT, 2); - usNe.encode(); - - usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); - usNe.setFieldValue(UsNeField.TARGETED_ADVERTISING_OPT_OUT, 1); - usNe.encode(); - }); - - it("should validate mspa", (): void => { - let usNe = new UsNe(); - - expect(function () { - usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 1); - usNe.setFieldValue(UsNeField.MSPA_OPT_OUT_OPTION_MODE, 0); - usNe.encode(); - }).to.throw(); - - expect(function () { - usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 1); - usNe.setFieldValue(UsNeField.MSPA_OPT_OUT_OPTION_MODE, 1); - usNe.encode(); - }).to.throw(); - - expect(function () { - usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 2); - usNe.setFieldValue(UsNeField.MSPA_OPT_OUT_OPTION_MODE, 0); - usNe.encode(); - }).to.throw(); - - expect(function () { - usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 2); - usNe.setFieldValue(UsNeField.MSPA_OPT_OUT_OPTION_MODE, 2); - usNe.encode(); - }).to.throw(); - - expect(function () { - usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 0); - usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 1); - usNe.encode(); - }).to.throw(); - - expect(function () { - usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 0); - usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 2); - usNe.encode(); - }).to.throw(); - - expect(function () { - usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 1); - usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 1); - usNe.encode(); - }).to.throw(); - - expect(function () { - usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 1); - usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 2); - usNe.encode(); - }).to.throw(); - - usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 0); - - usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 0); - usNe.setFieldValue(UsNeField.MSPA_OPT_OUT_OPTION_MODE, 0); - usNe.encode(); - - usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 0); - usNe.setFieldValue(UsNeField.MSPA_OPT_OUT_OPTION_MODE, 1); - usNe.encode(); - - usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 0); - usNe.setFieldValue(UsNeField.MSPA_OPT_OUT_OPTION_MODE, 2); - usNe.encode(); - - usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 1); - usNe.setFieldValue(UsNeField.MSPA_OPT_OUT_OPTION_MODE, 2); - usNe.encode(); - - usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 2); - usNe.setFieldValue(UsNeField.MSPA_OPT_OUT_OPTION_MODE, 1); - usNe.encode(); - - usNe.setFieldValue(UsNeField.MSPA_OPT_OUT_OPTION_MODE, 0); - - usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 0); - usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 0); - usNe.encode(); - - usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 1); - usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 0); - usNe.encode(); - - usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 2); - usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 0); - usNe.encode(); - - usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 2); - usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 1); - usNe.encode(); - - usNe.setFieldValue(UsNeField.MSPA_SERVICE_PROVIDER_MODE, 2); - usNe.setFieldValue(UsNeField.SALE_OPT_OUT_NOTICE, 2); - usNe.encode(); - }); - it("should decode BVWSSVWA.YA", (): void => { let usNe = new UsNe("BVWSSVWA.YA"); diff --git a/modules/cmpapi/test/encoder/section/UsNh.test.ts b/modules/cmpapi/test/encoder/section/UsNh.test.ts index 4231461..389fb2b 100644 --- a/modules/cmpapi/test/encoder/section/UsNh.test.ts +++ b/modules/cmpapi/test/encoder/section/UsNh.test.ts @@ -81,202 +81,6 @@ describe("manifest.section.UsNh", (): void => { }).to.throw(); }); - it("should validate sale", (): void => { - let usNh = new UsNh(); - - expect(function () { - usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 0); - usNh.setFieldValue(UsNhField.SALE_OPT_OUT, 1); - usNh.encode(); - }).to.throw(); - - expect(function () { - usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 0); - usNh.setFieldValue(UsNhField.SALE_OPT_OUT, 2); - usNh.encode(); - }).to.throw(); - - expect(function () { - usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 1); - usNh.setFieldValue(UsNhField.SALE_OPT_OUT, 0); - usNh.encode(); - }).to.throw(); - - expect(function () { - usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 2); - usNh.setFieldValue(UsNhField.SALE_OPT_OUT, 0); - usNh.encode(); - }).to.throw(); - - expect(function () { - usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 2); - usNh.setFieldValue(UsNhField.SALE_OPT_OUT, 2); - usNh.encode(); - }).to.throw(); - - usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 0); - usNh.setFieldValue(UsNhField.SALE_OPT_OUT, 0); - usNh.encode(); - - usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 1); - usNh.setFieldValue(UsNhField.SALE_OPT_OUT, 1); - usNh.encode(); - - usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 1); - usNh.setFieldValue(UsNhField.SALE_OPT_OUT, 2); - usNh.encode(); - - usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 2); - usNh.setFieldValue(UsNhField.SALE_OPT_OUT, 1); - usNh.encode(); - }); - - it("should validate targeted advertising", (): void => { - let usNh = new UsNh(); - - expect(function () { - usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); - usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT, 1); - usNh.encode(); - }).to.throw(); - - expect(function () { - usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); - usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT, 2); - usNh.encode(); - }).to.throw(); - - expect(function () { - usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); - usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT, 0); - usNh.encode(); - }).to.throw(); - - expect(function () { - usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); - usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT, 0); - usNh.encode(); - }).to.throw(); - - expect(function () { - usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); - usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT, 2); - usNh.encode(); - }).to.throw(); - - usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); - usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT, 0); - usNh.encode(); - - usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); - usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT, 1); - usNh.encode(); - - usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); - usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT, 2); - usNh.encode(); - - usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); - usNh.setFieldValue(UsNhField.TARGETED_ADVERTISING_OPT_OUT, 1); - usNh.encode(); - }); - - it("should validate mspa", (): void => { - let usNh = new UsNh(); - - expect(function () { - usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 1); - usNh.setFieldValue(UsNhField.MSPA_OPT_OUT_OPTION_MODE, 0); - usNh.encode(); - }).to.throw(); - - expect(function () { - usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 1); - usNh.setFieldValue(UsNhField.MSPA_OPT_OUT_OPTION_MODE, 1); - usNh.encode(); - }).to.throw(); - - expect(function () { - usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 2); - usNh.setFieldValue(UsNhField.MSPA_OPT_OUT_OPTION_MODE, 0); - usNh.encode(); - }).to.throw(); - - expect(function () { - usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 2); - usNh.setFieldValue(UsNhField.MSPA_OPT_OUT_OPTION_MODE, 2); - usNh.encode(); - }).to.throw(); - - expect(function () { - usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 0); - usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 1); - usNh.encode(); - }).to.throw(); - - expect(function () { - usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 0); - usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 2); - usNh.encode(); - }).to.throw(); - - expect(function () { - usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 1); - usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 1); - usNh.encode(); - }).to.throw(); - - expect(function () { - usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 1); - usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 2); - usNh.encode(); - }).to.throw(); - - usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 0); - - usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 0); - usNh.setFieldValue(UsNhField.MSPA_OPT_OUT_OPTION_MODE, 0); - usNh.encode(); - - usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 0); - usNh.setFieldValue(UsNhField.MSPA_OPT_OUT_OPTION_MODE, 1); - usNh.encode(); - - usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 0); - usNh.setFieldValue(UsNhField.MSPA_OPT_OUT_OPTION_MODE, 2); - usNh.encode(); - - usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 1); - usNh.setFieldValue(UsNhField.MSPA_OPT_OUT_OPTION_MODE, 2); - usNh.encode(); - - usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 2); - usNh.setFieldValue(UsNhField.MSPA_OPT_OUT_OPTION_MODE, 1); - usNh.encode(); - - usNh.setFieldValue(UsNhField.MSPA_OPT_OUT_OPTION_MODE, 0); - - usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 0); - usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 0); - usNh.encode(); - - usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 1); - usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 0); - usNh.encode(); - - usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 2); - usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 0); - usNh.encode(); - - usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 2); - usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 1); - usNh.encode(); - - usNh.setFieldValue(UsNhField.MSPA_SERVICE_PROVIDER_MODE, 2); - usNh.setFieldValue(UsNhField.SALE_OPT_OUT_NOTICE, 2); - usNh.encode(); - }); - it("should decode BVWSSZFY.YA", (): void => { let usNh = new UsNh("BVWSSZFY.YA"); diff --git a/modules/cmpapi/test/encoder/section/UsNj.test.ts b/modules/cmpapi/test/encoder/section/UsNj.test.ts index 75d068d..b4413dd 100644 --- a/modules/cmpapi/test/encoder/section/UsNj.test.ts +++ b/modules/cmpapi/test/encoder/section/UsNj.test.ts @@ -81,202 +81,6 @@ describe("manifest.section.UsNj", (): void => { }).to.throw(); }); - it("should validate sale", (): void => { - let usNj = new UsNj(); - - expect(function () { - usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 0); - usNj.setFieldValue(UsNjField.SALE_OPT_OUT, 1); - usNj.encode(); - }).to.throw(); - - expect(function () { - usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 0); - usNj.setFieldValue(UsNjField.SALE_OPT_OUT, 2); - usNj.encode(); - }).to.throw(); - - expect(function () { - usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 1); - usNj.setFieldValue(UsNjField.SALE_OPT_OUT, 0); - usNj.encode(); - }).to.throw(); - - expect(function () { - usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 2); - usNj.setFieldValue(UsNjField.SALE_OPT_OUT, 0); - usNj.encode(); - }).to.throw(); - - expect(function () { - usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 2); - usNj.setFieldValue(UsNjField.SALE_OPT_OUT, 2); - usNj.encode(); - }).to.throw(); - - usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 0); - usNj.setFieldValue(UsNjField.SALE_OPT_OUT, 0); - usNj.encode(); - - usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 1); - usNj.setFieldValue(UsNjField.SALE_OPT_OUT, 1); - usNj.encode(); - - usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 1); - usNj.setFieldValue(UsNjField.SALE_OPT_OUT, 2); - usNj.encode(); - - usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 2); - usNj.setFieldValue(UsNjField.SALE_OPT_OUT, 1); - usNj.encode(); - }); - - it("should validate targeted advertising", (): void => { - let usNj = new UsNj(); - - expect(function () { - usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); - usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT, 1); - usNj.encode(); - }).to.throw(); - - expect(function () { - usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); - usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT, 2); - usNj.encode(); - }).to.throw(); - - expect(function () { - usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); - usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT, 0); - usNj.encode(); - }).to.throw(); - - expect(function () { - usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); - usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT, 0); - usNj.encode(); - }).to.throw(); - - expect(function () { - usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); - usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT, 2); - usNj.encode(); - }).to.throw(); - - usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); - usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT, 0); - usNj.encode(); - - usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); - usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT, 1); - usNj.encode(); - - usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); - usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT, 2); - usNj.encode(); - - usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); - usNj.setFieldValue(UsNjField.TARGETED_ADVERTISING_OPT_OUT, 1); - usNj.encode(); - }); - - it("should validate mspa", (): void => { - let usNj = new UsNj(); - - expect(function () { - usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 1); - usNj.setFieldValue(UsNjField.MSPA_OPT_OUT_OPTION_MODE, 0); - usNj.encode(); - }).to.throw(); - - expect(function () { - usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 1); - usNj.setFieldValue(UsNjField.MSPA_OPT_OUT_OPTION_MODE, 1); - usNj.encode(); - }).to.throw(); - - expect(function () { - usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 2); - usNj.setFieldValue(UsNjField.MSPA_OPT_OUT_OPTION_MODE, 0); - usNj.encode(); - }).to.throw(); - - expect(function () { - usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 2); - usNj.setFieldValue(UsNjField.MSPA_OPT_OUT_OPTION_MODE, 2); - usNj.encode(); - }).to.throw(); - - expect(function () { - usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 0); - usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 1); - usNj.encode(); - }).to.throw(); - - expect(function () { - usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 0); - usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 2); - usNj.encode(); - }).to.throw(); - - expect(function () { - usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 1); - usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 1); - usNj.encode(); - }).to.throw(); - - expect(function () { - usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 1); - usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 2); - usNj.encode(); - }).to.throw(); - - usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 0); - - usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 0); - usNj.setFieldValue(UsNjField.MSPA_OPT_OUT_OPTION_MODE, 0); - usNj.encode(); - - usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 0); - usNj.setFieldValue(UsNjField.MSPA_OPT_OUT_OPTION_MODE, 1); - usNj.encode(); - - usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 0); - usNj.setFieldValue(UsNjField.MSPA_OPT_OUT_OPTION_MODE, 2); - usNj.encode(); - - usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 1); - usNj.setFieldValue(UsNjField.MSPA_OPT_OUT_OPTION_MODE, 2); - usNj.encode(); - - usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 2); - usNj.setFieldValue(UsNjField.MSPA_OPT_OUT_OPTION_MODE, 1); - usNj.encode(); - - usNj.setFieldValue(UsNjField.MSPA_OPT_OUT_OPTION_MODE, 0); - - usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 0); - usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 0); - usNj.encode(); - - usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 1); - usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 0); - usNj.encode(); - - usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 2); - usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 0); - usNj.encode(); - - usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 2); - usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 1); - usNj.encode(); - - usNj.setFieldValue(UsNjField.MSPA_SERVICE_PROVIDER_MODE, 2); - usNj.setFieldValue(UsNjField.SALE_OPT_OUT_NOTICE, 2); - usNj.encode(); - }); - it("should decode BVWSSRklWA.YA", (): void => { let usNj = new UsNj("BVWSSRklWA.YA"); diff --git a/modules/cmpapi/test/encoder/section/UsTn.test.ts b/modules/cmpapi/test/encoder/section/UsTn.test.ts index e1083be..849175f 100644 --- a/modules/cmpapi/test/encoder/section/UsTn.test.ts +++ b/modules/cmpapi/test/encoder/section/UsTn.test.ts @@ -81,202 +81,6 @@ describe("manifest.section.UsTn", (): void => { }).to.throw(); }); - it("should validate sale", (): void => { - let usTn = new UsTn(); - - expect(function () { - usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 0); - usTn.setFieldValue(UsTnField.SALE_OPT_OUT, 1); - usTn.encode(); - }).to.throw(); - - expect(function () { - usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 0); - usTn.setFieldValue(UsTnField.SALE_OPT_OUT, 2); - usTn.encode(); - }).to.throw(); - - expect(function () { - usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 1); - usTn.setFieldValue(UsTnField.SALE_OPT_OUT, 0); - usTn.encode(); - }).to.throw(); - - expect(function () { - usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 2); - usTn.setFieldValue(UsTnField.SALE_OPT_OUT, 0); - usTn.encode(); - }).to.throw(); - - expect(function () { - usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 2); - usTn.setFieldValue(UsTnField.SALE_OPT_OUT, 2); - usTn.encode(); - }).to.throw(); - - usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 0); - usTn.setFieldValue(UsTnField.SALE_OPT_OUT, 0); - usTn.encode(); - - usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 1); - usTn.setFieldValue(UsTnField.SALE_OPT_OUT, 1); - usTn.encode(); - - usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 1); - usTn.setFieldValue(UsTnField.SALE_OPT_OUT, 2); - usTn.encode(); - - usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 2); - usTn.setFieldValue(UsTnField.SALE_OPT_OUT, 1); - usTn.encode(); - }); - - it("should validate targeted advertising", (): void => { - let usTn = new UsTn(); - - expect(function () { - usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); - usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT, 1); - usTn.encode(); - }).to.throw(); - - expect(function () { - usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); - usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT, 2); - usTn.encode(); - }).to.throw(); - - expect(function () { - usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); - usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT, 0); - usTn.encode(); - }).to.throw(); - - expect(function () { - usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); - usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT, 0); - usTn.encode(); - }).to.throw(); - - expect(function () { - usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); - usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT, 2); - usTn.encode(); - }).to.throw(); - - usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 0); - usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT, 0); - usTn.encode(); - - usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); - usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT, 1); - usTn.encode(); - - usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 1); - usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT, 2); - usTn.encode(); - - usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT_NOTICE, 2); - usTn.setFieldValue(UsTnField.TARGETED_ADVERTISING_OPT_OUT, 1); - usTn.encode(); - }); - - it("should validate mspa", (): void => { - let usTn = new UsTn(); - - expect(function () { - usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 1); - usTn.setFieldValue(UsTnField.MSPA_OPT_OUT_OPTION_MODE, 0); - usTn.encode(); - }).to.throw(); - - expect(function () { - usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 1); - usTn.setFieldValue(UsTnField.MSPA_OPT_OUT_OPTION_MODE, 1); - usTn.encode(); - }).to.throw(); - - expect(function () { - usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 2); - usTn.setFieldValue(UsTnField.MSPA_OPT_OUT_OPTION_MODE, 0); - usTn.encode(); - }).to.throw(); - - expect(function () { - usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 2); - usTn.setFieldValue(UsTnField.MSPA_OPT_OUT_OPTION_MODE, 2); - usTn.encode(); - }).to.throw(); - - expect(function () { - usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 0); - usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 1); - usTn.encode(); - }).to.throw(); - - expect(function () { - usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 0); - usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 2); - usTn.encode(); - }).to.throw(); - - expect(function () { - usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 1); - usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 1); - usTn.encode(); - }).to.throw(); - - expect(function () { - usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 1); - usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 2); - usTn.encode(); - }).to.throw(); - - usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 0); - - usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 0); - usTn.setFieldValue(UsTnField.MSPA_OPT_OUT_OPTION_MODE, 0); - usTn.encode(); - - usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 0); - usTn.setFieldValue(UsTnField.MSPA_OPT_OUT_OPTION_MODE, 1); - usTn.encode(); - - usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 0); - usTn.setFieldValue(UsTnField.MSPA_OPT_OUT_OPTION_MODE, 2); - usTn.encode(); - - usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 1); - usTn.setFieldValue(UsTnField.MSPA_OPT_OUT_OPTION_MODE, 2); - usTn.encode(); - - usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 2); - usTn.setFieldValue(UsTnField.MSPA_OPT_OUT_OPTION_MODE, 1); - usTn.encode(); - - usTn.setFieldValue(UsTnField.MSPA_OPT_OUT_OPTION_MODE, 0); - - usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 0); - usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 0); - usTn.encode(); - - usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 1); - usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 0); - usTn.encode(); - - usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 2); - usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 0); - usTn.encode(); - - usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 2); - usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 1); - usTn.encode(); - - usTn.setFieldValue(UsTnField.MSPA_SERVICE_PROVIDER_MODE, 2); - usTn.setFieldValue(UsTnField.SALE_OPT_OUT_NOTICE, 2); - usTn.encode(); - }); - it("should decode BVWSSVWA.YA", (): void => { let usTn = new UsTn("BVWSSVWA.YA");