|
1 | 1 | use alloc::{vec, vec::Vec}; |
2 | 2 |
|
3 | | -use jvm::{JavaChar, JavaError, Result, runtime::JavaLangString}; |
| 3 | +use java_runtime::classes::java::lang::Object; |
| 4 | +use jvm::{ClassInstanceRef, JavaChar, JavaError, Result, runtime::JavaLangString}; |
4 | 5 |
|
5 | 6 | use test_utils::test_jvm; |
6 | 7 |
|
@@ -76,3 +77,64 @@ async fn test_input_stream_reader_rejects_unknown_encoding() -> Result<()> { |
76 | 77 |
|
77 | 78 | Ok(()) |
78 | 79 | } |
| 80 | + |
| 81 | +#[tokio::test] |
| 82 | +async fn test_reader_default_contract_and_lifecycle() -> Result<()> { |
| 83 | + let jvm = test_jvm().await?; |
| 84 | + |
| 85 | + let mut bytes = jvm.instantiate_array("B", 3).await?; |
| 86 | + jvm.store_array(&mut bytes, 0, [b'a' as i8, b'b' as i8, b'c' as i8]).await?; |
| 87 | + let input = jvm.new_class("java/io/ByteArrayInputStream", "([B)V", (bytes,)).await?; |
| 88 | + let reader = jvm.new_class("java/io/InputStreamReader", "(Ljava/io/InputStream;)V", (input,)).await?; |
| 89 | + |
| 90 | + assert!(jvm.invoke_virtual::<_, bool>(&reader, "ready", "()Z", ()).await?); |
| 91 | + assert!(!jvm.invoke_special::<_, bool>(&reader, "java/io/Reader", "ready", "()Z", ()).await?); |
| 92 | + assert_eq!(jvm.invoke_virtual::<_, i32>(&reader, "read", "()I", ()).await?, 'a' as i32); |
| 93 | + |
| 94 | + let chars = jvm.instantiate_array("C", 2).await?; |
| 95 | + assert_eq!(jvm.invoke_virtual::<_, i32>(&reader, "read", "([C)I", (chars.clone(),)).await?, 2); |
| 96 | + assert_eq!(jvm.load_array::<JavaChar>(&chars, 0, 2).await?, ['b' as JavaChar, 'c' as JavaChar]); |
| 97 | + assert_eq!(jvm.invoke_virtual::<_, i32>(&reader, "read", "()I", ()).await?, -1); |
| 98 | + |
| 99 | + let empty = jvm.instantiate_array("C", 0).await?; |
| 100 | + assert_eq!(jvm.invoke_virtual::<_, i32>(&reader, "read", "([CII)I", (empty, 0, 0)).await?, 0); |
| 101 | + assert!(!jvm.invoke_virtual::<_, bool>(&reader, "markSupported", "()Z", ()).await?); |
| 102 | + |
| 103 | + let mark: Result<()> = jvm.invoke_virtual(&reader, "mark", "(I)V", (1,)).await; |
| 104 | + let Err(JavaError::JavaException(exception)) = mark else { |
| 105 | + panic!("default mark must throw IOException"); |
| 106 | + }; |
| 107 | + assert!(jvm.is_instance(&*exception, "java/io/IOException")); |
| 108 | + |
| 109 | + let reset: Result<()> = jvm.invoke_virtual(&reader, "reset", "()V", ()).await; |
| 110 | + let Err(JavaError::JavaException(exception)) = reset else { |
| 111 | + panic!("default reset must throw IOException"); |
| 112 | + }; |
| 113 | + assert!(jvm.is_instance(&*exception, "java/io/IOException")); |
| 114 | + |
| 115 | + let negative_skip: Result<i64> = jvm.invoke_virtual(&reader, "skip", "(J)J", (-1i64,)).await; |
| 116 | + let Err(JavaError::JavaException(exception)) = negative_skip else { |
| 117 | + panic!("negative skip must throw IllegalArgumentException"); |
| 118 | + }; |
| 119 | + assert!(jvm.is_instance(&*exception, "java/lang/IllegalArgumentException")); |
| 120 | + |
| 121 | + let mut bytes = jvm.instantiate_array("B", 3).await?; |
| 122 | + jvm.store_array(&mut bytes, 0, [b'x' as i8, b'y' as i8, b'z' as i8]).await?; |
| 123 | + let input = jvm.new_class("java/io/ByteArrayInputStream", "([B)V", (bytes,)).await?; |
| 124 | + let reader = jvm.new_class("java/io/InputStreamReader", "(Ljava/io/InputStream;)V", (input,)).await?; |
| 125 | + assert_eq!(jvm.invoke_virtual::<_, i64>(&reader, "skip", "(J)J", (2i64,)).await?, 2); |
| 126 | + assert_eq!(jvm.invoke_virtual::<_, i32>(&reader, "read", "()I", ()).await?, 'z' as i32); |
| 127 | + assert_eq!(jvm.invoke_virtual::<_, i64>(&reader, "skip", "(J)J", (2i64,)).await?, 0); |
| 128 | + let _: () = jvm.invoke_virtual(&reader, "close", "()V", ()).await?; |
| 129 | + |
| 130 | + let null_lock: ClassInstanceRef<Object> = None.into(); |
| 131 | + let result: Result<()> = jvm |
| 132 | + .invoke_special(&reader, "java/io/Reader", "<init>", "(Ljava/lang/Object;)V", (null_lock,)) |
| 133 | + .await; |
| 134 | + let Err(JavaError::JavaException(exception)) = result else { |
| 135 | + panic!("null lock must throw NullPointerException"); |
| 136 | + }; |
| 137 | + assert!(jvm.is_instance(&*exception, "java/lang/NullPointerException")); |
| 138 | + |
| 139 | + Ok(()) |
| 140 | +} |
0 commit comments