| |
|
|
| use codex_code_mode_runtime::ExecuteRequest; |
| use codex_code_mode_runtime::FunctionCallOutputContentItem; |
| use codex_code_mode_runtime::InProcessCodeModeSession; |
| use codex_code_mode_runtime::NoopCodeModeSessionDelegate; |
| use codex_code_mode_runtime::RuntimeResponse; |
| use pretty_assertions::assert_eq; |
| use std::sync::Arc; |
|
|
| #[tokio::test] |
| async fn array_sort_preserves_element_kinds_after_comparator_mutation() { |
| |
| |
| v8::V8::set_flags_from_string("--allow-natives-syntax --turbolev"); |
| let service = InProcessCodeModeSession::new(); |
| let started = service |
| .execute( |
| ExecuteRequest { |
| tool_call_id: "call_1".to_string(), |
| enabled_tools: Vec::new(), |
| source: r#" |
| function sortTopTier(values) { |
| return values.sort(() => { |
| values.fill(0); |
| return 0; |
| }); |
| } |
| function sortMaglev(values) { |
| return values.sort(() => { |
| values.fill(0); |
| return 0; |
| }); |
| } |
| function prepare(sort) { |
| %PrepareFunctionForOptimization(sort); |
| for (let i = 0; i < 100; ++i) { |
| sort([1, 2]); |
| sort([{}, {}]); |
| } |
| } |
| function check(sort) { |
| sort([1, 2]); |
| const object = {}; |
| const values = [object, {}]; |
| sort(values); |
| if (%HasSmiElements(values) && values[0] === object) { |
| throw new Error("sort stored an object in an integer-elements array"); |
| } |
| } |
| prepare(sortTopTier); |
| %OptimizeFunctionOnNextCall(sortTopTier); |
| check(sortTopTier); |
| prepare(sortMaglev); |
| %OptimizeMaglevOnNextCall(sortMaglev); |
| check(sortMaglev); |
| text(JSON.stringify([3, 1, 2].sort((a, b) => a - b))); |
| "# |
| .to_string(), |
| yield_time_ms: None, |
| max_output_tokens: None, |
| }, |
| Arc::new(NoopCodeModeSessionDelegate), |
| ) |
| .await |
| .expect("start code-mode cell"); |
| let cell_id = started.cell_id.clone(); |
| let response = started |
| .initial_response() |
| .await |
| .expect("execute code-mode cell"); |
|
|
| assert_eq!( |
| response, |
| RuntimeResponse::Result { |
| code_mode_host_duration: None, |
| cell_id, |
| content_items: vec![FunctionCallOutputContentItem::InputText { |
| text: "[1,2,3]".to_string(), |
| }], |
| error_text: None, |
| } |
| ); |
| } |
|
|