Add tests for radiobutton/checkbox JS properties.

Fix bad indexing discovered as a result.

Change-Id: I6241ee32d11948ed242cf8a0b9f8898e8769a869
Reviewed-on: https://pdfium-review.googlesource.com/c/45470
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/fxjs/cjs_field.cpp b/fxjs/cjs_field.cpp
index eb594cf..2b68f47 100644
--- a/fxjs/cjs_field.cpp
+++ b/fxjs/cjs_field.cpp
@@ -1868,9 +1868,10 @@
     return CJS_Result::Failure(JSMessage::kBadObjectError);
 
   WideString csWCaption = pFormControl->GetNormalCaption();
-  ByteString csBCaption;
+  wchar_t selector = !csWCaption.IsEmpty() ? csWCaption[0] : L'4';
 
-  switch (csWCaption[0]) {
+  ByteString csBCaption;
+  switch (selector) {
     case L'l':
       csBCaption = "circle";
       break;
diff --git a/testing/resources/javascript/field.fragment b/testing/resources/javascript/field.fragment
index f696018..843a813 100644
--- a/testing/resources/javascript/field.fragment
+++ b/testing/resources/javascript/field.fragment
@@ -66,7 +66,8 @@
 >>
 endobj
 {{object 8 0}} <<
-  /FT /Tx
+  /FT /Btn
+  /Ff 32768
   /Parent 5 0 R
   /T (Sub_Z)
   /Type /Annot
@@ -75,7 +76,8 @@
 >>
 endobj
 {{object 9 0}} <<
-  /FT /Tx
+  /FT /Btn
+  /Ff 0
   /Parent 5 0 R
   /T (Sub_B)
   /Type /Annot
diff --git a/testing/resources/javascript/field_properties.in b/testing/resources/javascript/field_properties.in
index fdd24ab..c638d86 100644
--- a/testing/resources/javascript/field_properties.in
+++ b/testing/resources/javascript/field_properties.in
@@ -1,6 +1,6 @@
 {{header}}
-{{header}}
 {{include field.fragment}}
+
 % JS program to exexute
 {{object 11 0}} <<
   {{streamlen}}
@@ -89,6 +89,8 @@
   try {
     var field = this.getField("MyField");
     var button = this.getField("MyField.Sub_A");
+    var radio = this.getField("MyField.Sub_Z");
+    var check = this.getField("MyField.Sub_B");
     app.alert('Testing properties under delay');
     testRWProperty(field, "delay", false, true);
     // TODO(tsepez): try this case, too.
@@ -96,7 +98,9 @@
     app.alert('Testing properties under non-delay');
     testRWProperty(field, "delay", true, false);
     testTextPropertiesCase(field);
-    testButtonPropertiesCase(button);
+    testPushButtonPropertiesCase(button);
+    testRadioButtonPropertiesCase(radio);
+    testCheckBoxPropertiesCase(check);
   } catch (e) {
     app.alert("Unexpected error: " + e);
   }
@@ -119,7 +123,6 @@
     testRWProperty(field, "display", 2, 3);
     testROProperty(field, "doc", "[object global]");
     // testROProperty(field, "editable", "clams");
-    // testROProperty(field, "exportValues", "clams");
     testRWProperty(field, "hidden", false, true);
     testRIProperty(field, "fileSelect", false, true);
     testRIProperty(field, "fillColor", "T", ["RGB", 0, 0, 0]);
@@ -131,7 +134,6 @@
     testROProperty(field, "page", 0);
     testRIProperty(field, "password", false, 42);
     testRWProperty(field, "print", true, false);
-    // testROProperty(field, "radiosInUnison", "clams");
     testRIProperty(field, "readonly", false, true);
     // testRWProperty(field, "rect", [0,0,0,0], [0,0,0,0]);
     // testROProperty(field, "required", "clams");
@@ -140,7 +142,6 @@
     testRIProperty(field, "rotation", 0, 42);
     testRIProperty(field, "source", undefined, "clams");
     testRIProperty(field, "strokeColor", "T", ["RGB", 0, 0, 0]);
-    // testROProperty(field, "style", "clams");
     testRIProperty(field, "submitName", undefined, "clams");
     testRIProperty(field, "textColor", "T", ["RGB", 0, 0, 0]);
     // testROProperty(field, "textFont", "clams");
@@ -154,7 +155,7 @@
   }
 }
 
-function testButtonPropertiesCase(field) {
+function testPushButtonPropertiesCase(field) {
   try {
     testRIProperty(field, "buttonAlignX", 0, 50);
     testRIProperty(field, "buttonAlignY", 0, 50);
@@ -169,6 +170,31 @@
   }
 }
 
+function testRadioButtonPropertiesCase(field) {
+  try {
+    testROProperty(field, "exportValues", "N");
+    testRIProperty(field, "radiosInUnison", false);
+    testRIProperty(field, "style", "check");
+    testROProperty(field, "type", "radiobutton");
+    testRIProperty(field, "value", "Off");
+    testROProperty(field, "valueAsString", "Off");
+  } catch (e) {
+    app.alert("Unexpected error: " + e);
+  }
+}
+
+function testCheckBoxPropertiesCase(field) {
+  try {
+    testROProperty(field, "exportValues", "N");
+    testRIProperty(field, "style", "check");
+    testROProperty(field, "type", "checkbox");
+    testRIProperty(field, "value", "Off");
+    testROProperty(field, "valueAsString", "Off");
+  } catch (e) {
+    app.alert("Unexpected error: " + e);
+  }
+}
+
 testProperties();
 endstream
 endobj
diff --git a/testing/resources/javascript/field_properties_expected.txt b/testing/resources/javascript/field_properties_expected.txt
index 1a5a6f1..3e06195 100644
--- a/testing/resources/javascript/field_properties_expected.txt
+++ b/testing/resources/javascript/field_properties_expected.txt
@@ -86,3 +86,25 @@
 Alert: PASS: highlight = invert
 Alert: PASS: type = button
 Alert: PASS: type threw Field.type: Operation not supported.
+Alert: PASS: exportValues = N
+Alert: PASS: exportValues threw Field.exportValues: Object no longer exists.
+Alert: PASS: radiosInUnison = false
+Alert: PASS: radiosInUnison = false
+Alert: PASS: style = check
+Alert: PASS: style = check
+Alert: PASS: type = radiobutton
+Alert: PASS: type threw Field.type: Operation not supported.
+Alert: PASS: value = Off
+Alert: PASS: value = Off
+Alert: PASS: valueAsString = Off
+Alert: PASS: valueAsString threw Field.valueAsString: Operation not supported.
+Alert: PASS: exportValues = N
+Alert: PASS: exportValues threw Field.exportValues: Object no longer exists.
+Alert: PASS: style = check
+Alert: PASS: style = check
+Alert: PASS: type = checkbox
+Alert: PASS: type threw Field.type: Operation not supported.
+Alert: PASS: value = Off
+Alert: PASS: value = Off
+Alert: PASS: valueAsString = Off
+Alert: PASS: valueAsString threw Field.valueAsString: Operation not supported.