|
1 | 1 | using System; |
| 2 | +using System.Linq; |
2 | 3 | using MonoDroid.Generation; |
3 | 4 | using NUnit.Framework; |
4 | 5 | using Xamarin.Android.Binder; |
@@ -149,6 +150,48 @@ public void WriteSealedOverriddenDefaultMethod () |
149 | 150 | Assert.False (writer.ToString ().Contains ("virtual sealed")); |
150 | 151 | } |
151 | 152 |
|
| 153 | + [Test] |
| 154 | + public void WriteInterfaceRedeclaredChainDefaultMethod () |
| 155 | + { |
| 156 | + // Fix a case where a property declared in this hierarchy was generated as "override" instead of "virtual" |
| 157 | + // public interface MyInterface { default int getValue () { return 0; } } |
| 158 | + // public class MyClass implements MyInterface { } |
| 159 | + // public class MySecondClass extends MyClass { @Override public int getValue () { return 1; } } |
| 160 | + var gens = ParseApiDefinition (@"<api> |
| 161 | + <package name='java.lang' jni-name='java/lang'> |
| 162 | + <class abstract='false' deprecated='not deprecated' final='false' name='Object' static='false' visibility='public' jni-signature='Ljava/lang/EmptyOverrideClass;' /> |
| 163 | + </package> |
| 164 | + <package name='com.xamarin.android' jni-name='com/xamarin/android'> |
| 165 | + <interface abstract='true' deprecated='not deprecated' final='false' name='DefaultMethodsInterface' static='false' visibility='public' jni-signature='Lcom/xamarin/android/DefaultMethodsInterface;'> |
| 166 | + <method abstract='false' deprecated='not deprecated' final='false' name='foo' jni-signature='()I' bridge='false' native='false' return='int' jni-return='I' static='false' synchronized='false' synthetic='false' visibility='public'></method> |
| 167 | + <method abstract='false' deprecated='not deprecated' final='false' name='getBar' jni-signature='()I' bridge='false' native='false' return='int' jni-return='I' static='false' synchronized='false' synthetic='false' visibility='public'></method> |
| 168 | + <method abstract='false' deprecated='not deprecated' final='false' name='setBar' jni-signature='(I)V' bridge='false' native='false' return='void' jni-return='V' static='false' synchronized='false' synthetic='false' visibility='public'> |
| 169 | + <parameter name='p0' type='int' jni-type='I'></parameter> |
| 170 | + </method> |
| 171 | + </interface> |
| 172 | + <class abstract='false' deprecated='not deprecated' extends='java.lang.Object' extends-generic-aware='java.lang.Object' jni-extends='Ljava/lang/Object;' final='false' name='EmptyOverrideClass' static='false' visibility='public' jni-signature='Lcom/xamarin/android/EmptyOverrideClass;'> |
| 173 | + <implements name='com.xamarin.android.DefaultMethodsInterface' name-generic-aware='com.xamarin.android.DefaultMethodsInterface' jni-type='Lcom/xamarin/android/DefaultMethodsInterface;'></implements> |
| 174 | + <constructor deprecated='not deprecated' final='false' name='EmptyOverrideClass' jni-signature='()V' bridge='false' static='false' type='com.xamarin.android.EmptyOverrideClass' synthetic='false' visibility='public'></constructor> |
| 175 | + </class> |
| 176 | + <class abstract='false' deprecated='not deprecated' extends='com.xamarin.android.EmptyOverrideClass' extends-generic-aware='com.xamarin.android.EmptyOverrideClass' jni-extends='Lcom/xamarin/android/EmptyOverrideClass;' final='false' name='ImplementedChainOverrideClass' static='false' visibility='public' jni-signature='Lcom/xamarin/android/ImplementedChainOverrideClass;'> |
| 177 | + <constructor deprecated='not deprecated' final='false' name='ImplementedChainOverrideClass' jni-signature='()V' bridge='false' static='false' type='com.xamarin.android.ImplementedChainOverrideClass' synthetic='false' visibility='public'></constructor> |
| 178 | + <method abstract='false' deprecated='not deprecated' final='false' name='getBar' jni-signature='()I' bridge='false' native='false' return='int' jni-return='I' static='false' synchronized='false' synthetic='false' visibility='public'></method> |
| 179 | + <method abstract='false' deprecated='not deprecated' final='false' name='setBar' jni-signature='(I)V' bridge='false' native='false' return='void' jni-return='V' static='false' synchronized='false' synthetic='false' visibility='public'> |
| 180 | + <parameter name='p0' type='int' jni-type='I'></parameter> |
| 181 | + </method> |
| 182 | + </class> |
| 183 | + </package> |
| 184 | + </api>"); |
| 185 | + |
| 186 | + var klass = (ClassGen)gens.First (g => g.Name == "ImplementedChainOverrideClass"); |
| 187 | + |
| 188 | + generator.Context.ContextTypes.Push (klass); |
| 189 | + generator.WriteClass (klass, string.Empty, new GenerationInfo (string.Empty, string.Empty, "MyAssembly")); |
| 190 | + generator.Context.ContextTypes.Pop (); |
| 191 | + |
| 192 | + Assert.True (writer.ToString ().Contains ("public virtual unsafe int Bar")); |
| 193 | + } |
| 194 | + |
152 | 195 | [Test] |
153 | 196 | public void WriteStaticInterfaceMethod () |
154 | 197 | { |
|
0 commit comments