Skip to content

Commit 87a7734

Browse files
committed
Add java.lang.String::startsWith
1 parent 5616b77 commit 87a7734

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed

java_runtime/src/classes/java/lang/string.rs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ impl String {
6161
JavaMethodProto::new("indexOf", "(Ljava/lang/String;)I", Self::index_of_string, Default::default()),
6262
JavaMethodProto::new("indexOf", "(Ljava/lang/String;I)I", Self::index_of_string_from, Default::default()),
6363
JavaMethodProto::new("trim", "()Ljava/lang/String;", Self::trim, Default::default()),
64+
JavaMethodProto::new("startsWith", "(Ljava/lang/String;)Z", Self::starts_with, Default::default()),
65+
JavaMethodProto::new("startsWith", "(Ljava/lang/String;I)Z", Self::starts_with_offset, Default::default()),
6466
],
6567
fields: vec![JavaFieldProto::new("value", "[C", Default::default())],
6668
}
@@ -395,6 +397,31 @@ impl String {
395397
Ok(JavaLangString::from_rust_string(jvm, &upper).await?.into())
396398
}
397399

400+
async fn starts_with(jvm: &Jvm, _: &mut RuntimeContext, this: ClassInstanceRef<Self>, prefix: ClassInstanceRef<Self>) -> Result<bool> {
401+
tracing::debug!("java.lang.String::startsWith({:?}, {:?})", &this, &prefix);
402+
403+
jvm.invoke_virtual(&this, "startsWith", "(Ljava/lang/String;I)Z", (prefix, 0)).await
404+
}
405+
406+
async fn starts_with_offset(
407+
jvm: &Jvm,
408+
_: &mut RuntimeContext,
409+
this: ClassInstanceRef<Self>,
410+
prefix: ClassInstanceRef<Self>,
411+
offset: i32,
412+
) -> Result<bool> {
413+
tracing::debug!("java.lang.String::startsWith({:?}, {:?}, {})", &this, &prefix, offset);
414+
415+
let this_string = JavaLangString::to_rust_string(jvm, &this.clone())
416+
.await?
417+
.chars()
418+
.skip(offset as usize)
419+
.collect::<RustString>();
420+
let prefix_string = JavaLangString::to_rust_string(jvm, &prefix.clone()).await?;
421+
422+
Ok(this_string.starts_with(&prefix_string))
423+
}
424+
398425
fn decode_str(charset: &str, bytes: &[u8]) -> RustString {
399426
match charset {
400427
"UTF-8" => str::from_utf8(bytes).unwrap().to_string(),
@@ -513,4 +540,37 @@ mod test {
513540

514541
Ok(())
515542
}
543+
544+
#[tokio::test]
545+
async fn test_starts_with() -> Result<()> {
546+
let jvm = test_jvm().await?;
547+
548+
let string = JavaLangString::from_rust_string(&jvm, "123 테스트 456").await?;
549+
550+
let pattern = JavaLangString::from_rust_string(&jvm, "123").await?;
551+
let result: bool = jvm.invoke_virtual(&string, "startsWith", "(Ljava/lang/String;)Z", (pattern,)).await?;
552+
assert!(result);
553+
554+
let pattern = JavaLangString::from_rust_string(&jvm, "456").await?;
555+
let result: bool = jvm.invoke_virtual(&string, "startsWith", "(Ljava/lang/String;)Z", (pattern,)).await?;
556+
assert!(!result);
557+
558+
let pattern = JavaLangString::from_rust_string(&jvm, "123 테스트").await?;
559+
let result: bool = jvm.invoke_virtual(&string, "startsWith", "(Ljava/lang/String;)Z", (pattern,)).await?;
560+
assert!(result);
561+
562+
let pattern = JavaLangString::from_rust_string(&jvm, "테스트").await?;
563+
let result: bool = jvm.invoke_virtual(&string, "startsWith", "(Ljava/lang/String;)Z", (pattern,)).await?;
564+
assert!(!result);
565+
566+
let pattern = JavaLangString::from_rust_string(&jvm, "테스트").await?;
567+
let result: bool = jvm.invoke_virtual(&string, "startsWith", "(Ljava/lang/String;I)Z", (pattern, 4)).await?;
568+
assert!(result);
569+
570+
let pattern = JavaLangString::from_rust_string(&jvm, "테스트").await?;
571+
let result: bool = jvm.invoke_virtual(&string, "startsWith", "(Ljava/lang/String;I)Z", (pattern, 5)).await?;
572+
assert!(!result);
573+
574+
Ok(())
575+
}
516576
}

0 commit comments

Comments
 (0)