diff --git a/src/utils/EnumMappings.Xml.cs b/src/utils/EnumMappings.Xml.cs
index dc13f361c..fb593275b 100644
--- a/src/utils/EnumMappings.Xml.cs
+++ b/src/utils/EnumMappings.Xml.cs
@@ -23,25 +23,33 @@ internal static TextReader FieldXmlToCsv (string file)
if (file == null)
return null;
+ return FieldXmlToCsv (XDocument.Load (file, LoadOptions.SetBaseUri | LoadOptions.SetLineInfo));
+ }
+
+ internal static TextReader FieldXmlToCsv (XDocument doc)
+ {
var sw = new StringWriter ();
- var doc = XDocument.Load (file, LoadOptions.SetBaseUri | LoadOptions.SetLineInfo);
foreach (var e in doc.XPathSelectElements ("/enum-field-mappings/mapping")) {
- string enu = GetMandatoryAttribute (e, "clr-enum-type");
- string jni_type = e.Attribute ("jni-class") != null
- ? e.XGetAttribute ("jni-class")
- : e.Attribute ("jni-interface") != null
- ? "I:" + e.XGetAttribute ("jni-interface")
- : GetMandatoryAttribute (e, "jni-class or jni-interface");
- bool bitfield = e.Attribute ("bitfield") != null && e.XGetAttribute ("bitfield") == "true";
+
+ var enu = GetMandatoryAttribute (e, "clr-enum-type");
+ var jni_type = e.XGetAttribute ("jni-class") ?? "I:" + e.XGetAttribute ("jni-interface");
+
+ // If neither jni was specified leave it blank
+ if (jni_type == "I:")
+ jni_type = string.Empty;
+
+ var bitfield = e.XGetAttribute ("bitfield") == "true";
+
foreach (var m in e.XPathSelectElements ("field")) {
- string verstr = m.Attribute ("api-level") != null
- ? m.XGetAttribute ("api-level")
- : "0";
- string member = GetMandatoryAttribute (m, "clr-name");
- string jni_name = GetMandatoryAttribute (m, "jni-name");
- string value = GetMandatoryAttribute (m, "value");
- sw.WriteLine ("{0}, {1}, {2}, {3}, {4}{5}", verstr, enu, member, jni_type + '.' + jni_name, value, bitfield ? ", Flags" : null);
+ var verstr = m.XGetAttribute ("api-level") ?? "0";
+ var member = GetMandatoryAttribute (m, "clr-name");
+ var jni_name = m.XGetAttribute ("jni-name");
+ var value = GetMandatoryAttribute (m, "value");
+
+ var jni_member = string.IsNullOrWhiteSpace (jni_name) ? string.Empty : jni_type + '.' + jni_name;
+
+ sw.WriteLine ("{0}, {1}, {2}, {3}, {4}{5}", verstr, enu, member, jni_member, value, bitfield ? ", Flags" : null);
}
}
diff --git a/tests/generator-Tests/Unit-Tests/EnumMappingsTests.cs b/tests/generator-Tests/Unit-Tests/EnumMappingsTests.cs
index e3dcde232..4eaaf1edb 100644
--- a/tests/generator-Tests/Unit-Tests/EnumMappingsTests.cs
+++ b/tests/generator-Tests/Unit-Tests/EnumMappingsTests.cs
@@ -4,6 +4,7 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
+using System.Xml.Linq;
using MonoDroid.Generation;
using NUnit.Framework;
@@ -284,5 +285,101 @@ public void TransientEnumificationV2Test ()
Assert.AreEqual ("[Cdsect, I:org/xmlpull/v1/XmlPullParser.CDSECT]", enums.First ().Value.JniNames.Single ().ToString ());
Assert.AreEqual ("[Cdsect, 5]", enums.First ().Value.Members.Single ().ToString ());
}
+
+ [Test]
+ public void XmlEnumMapWithJNI ()
+ {
+ var xml = @"
+
+
+
+
+
+ ";
+
+ var doc = XDocument.Parse (xml, LoadOptions.SetBaseUri | LoadOptions.SetLineInfo);
+ var sr = EnumMappings.FieldXmlToCsv (doc);
+
+ var lines = sr.ReadToEnd ().Split (new [] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
+ var expected = new [] {
+ "0, Android.Support.V4.App.FragmentTagType, Name, android/support/v4/app/FragmentActivity$FragmentTag.Fragment_name, 0",
+ "0, Android.Support.V4.App.FragmentTagType, Id, android/support/v4/app/FragmentActivity$FragmentTag.Fragment_id, 1",
+ "0, Android.Support.V4.App.FragmentTagType, Tag, android/support/v4/app/FragmentActivity$FragmentTag.Fragment_tag, 2"
+ };
+
+ Assert.AreEqual (expected, lines);
+ }
+
+ [Test]
+ public void XmlEnumMapWithInterfaceJNI ()
+ {
+ var xml = @"
+
+
+
+
+
+ ";
+
+ var doc = XDocument.Parse (xml, LoadOptions.SetBaseUri | LoadOptions.SetLineInfo);
+ var sr = EnumMappings.FieldXmlToCsv (doc);
+
+ var lines = sr.ReadToEnd ().Split (new [] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
+ var expected = new [] {
+ "0, Android.Support.V4.App.FragmentTagType, Name, I:android/support/v4/app/FragmentActivity$FragmentTag.Fragment_name, 0, Flags",
+ "0, Android.Support.V4.App.FragmentTagType, Id, I:android/support/v4/app/FragmentActivity$FragmentTag.Fragment_id, 1, Flags",
+ "0, Android.Support.V4.App.FragmentTagType, Tag, I:android/support/v4/app/FragmentActivity$FragmentTag.Fragment_tag, 2, Flags"
+ };
+
+ Assert.AreEqual (expected, lines);
+ }
+
+ [Test]
+ public void XmlEnumMapWithoutJNI ()
+ {
+ var xml = @"
+
+
+
+
+
+ ";
+
+ var doc = XDocument.Parse (xml, LoadOptions.SetBaseUri | LoadOptions.SetLineInfo);
+ var sr = EnumMappings.FieldXmlToCsv (doc);
+
+ var lines = sr.ReadToEnd ().Split (new [] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
+ var expected = new [] {
+ "0, Android.Support.V4.App.FragmentTagType, Name, , 0, Flags",
+ "0, Android.Support.V4.App.FragmentTagType, Id, , 1, Flags",
+ "0, Android.Support.V4.App.FragmentTagType, Tag, , 2, Flags"
+ };
+
+ Assert.AreEqual (expected, lines);
+ }
+
+ [Test]
+ public void XmlEnumMapWithMixedJNI ()
+ {
+ var xml = @"
+
+
+
+
+
+ ";
+
+ var doc = XDocument.Parse (xml, LoadOptions.SetBaseUri | LoadOptions.SetLineInfo);
+ var sr = EnumMappings.FieldXmlToCsv (doc);
+
+ var lines = sr.ReadToEnd ().Split (new [] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
+ var expected = new [] {
+ "0, Android.Support.V4.App.FragmentTagType, Name, , 0, Flags",
+ "0, Android.Support.V4.App.FragmentTagType, Id, android/support/v4/app/FragmentActivity$FragmentTag.Fragment_id, 1, Flags",
+ "0, Android.Support.V4.App.FragmentTagType, Tag, , 2, Flags"
+ };
+
+ Assert.AreEqual (expected, lines);
+ }
}
}