WebAssembly.rs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. use js_sys::*;
  2. use wasm_bindgen::{prelude::*, JsCast};
  3. use wasm_bindgen_futures::JsFuture;
  4. use wasm_bindgen_test::*;
  5. #[wasm_bindgen(module = "tests/wasm/WebAssembly.js")]
  6. extern "C" {
  7. #[wasm_bindgen(js_name = getWasmArray)]
  8. fn get_wasm_array() -> Uint8Array;
  9. #[wasm_bindgen(js_name = getTableObject)]
  10. fn get_table_object() -> Object;
  11. #[wasm_bindgen(js_name = getInvalidTableObject)]
  12. fn get_invalid_table_object() -> Object;
  13. #[wasm_bindgen(js_name = getImports)]
  14. fn get_imports() -> Object;
  15. }
  16. fn get_invalid_wasm() -> JsValue {
  17. ArrayBuffer::new(42).into()
  18. }
  19. fn get_bad_type_wasm() -> JsValue {
  20. 2.into()
  21. }
  22. fn get_valid_wasm() -> JsValue {
  23. get_wasm_array().into()
  24. }
  25. #[wasm_bindgen_test]
  26. fn validate() {
  27. assert!(!WebAssembly::validate(&get_invalid_wasm()).unwrap());
  28. assert!(WebAssembly::validate(&get_bad_type_wasm()).is_err());
  29. }
  30. #[wasm_bindgen_test]
  31. async fn compile_compile_error() {
  32. let p = WebAssembly::compile(&get_invalid_wasm());
  33. let e = JsFuture::from(p).await.unwrap_err();
  34. assert!(e.is_instance_of::<WebAssembly::CompileError>());
  35. }
  36. #[wasm_bindgen_test]
  37. async fn compile_type_error() {
  38. let p = WebAssembly::compile(&get_bad_type_wasm());
  39. let e = JsFuture::from(p).await.unwrap_err();
  40. assert!(e.is_instance_of::<TypeError>());
  41. }
  42. #[wasm_bindgen_test]
  43. async fn compile_valid() {
  44. let p = WebAssembly::compile(&get_valid_wasm());
  45. let module = JsFuture::from(p).await.unwrap();
  46. assert!(module.is_instance_of::<WebAssembly::Module>());
  47. }
  48. #[wasm_bindgen_test]
  49. fn module_inheritance() {
  50. let module = WebAssembly::Module::new(&get_valid_wasm()).unwrap();
  51. assert!(module.is_instance_of::<WebAssembly::Module>());
  52. assert!(module.is_instance_of::<Object>());
  53. let _: &Object = module.as_ref();
  54. }
  55. #[wasm_bindgen_test]
  56. fn module_error() {
  57. let error = WebAssembly::Module::new(&get_invalid_wasm()).err().unwrap();
  58. assert!(error.is_instance_of::<WebAssembly::CompileError>());
  59. let error = WebAssembly::Module::new(&get_bad_type_wasm())
  60. .err()
  61. .unwrap();
  62. assert!(error.is_instance_of::<TypeError>());
  63. }
  64. #[wasm_bindgen_test]
  65. fn module_custom_sections() {
  66. let module = WebAssembly::Module::new(&get_valid_wasm()).unwrap();
  67. let cust_sec = WebAssembly::Module::custom_sections(&module, "abcd");
  68. assert_eq!(cust_sec.length(), 0);
  69. }
  70. #[wasm_bindgen_test]
  71. fn module_exports() {
  72. let module = WebAssembly::Module::new(&get_valid_wasm()).unwrap();
  73. let exports = WebAssembly::Module::exports(&module);
  74. assert_eq!(exports.length(), 1);
  75. }
  76. #[wasm_bindgen_test]
  77. fn module_imports() {
  78. let module = WebAssembly::Module::new(&get_valid_wasm()).unwrap();
  79. let imports = WebAssembly::Module::imports(&module);
  80. assert_eq!(imports.length(), 1);
  81. }
  82. #[wasm_bindgen_test]
  83. fn table_inheritance() {
  84. let table = WebAssembly::Table::new(&get_table_object().into()).unwrap();
  85. assert!(table.is_instance_of::<WebAssembly::Table>());
  86. assert!(table.is_instance_of::<Object>());
  87. let _: &Object = table.as_ref();
  88. }
  89. #[wasm_bindgen_test]
  90. fn table_error() {
  91. let error = WebAssembly::Table::new(&get_invalid_table_object())
  92. .err()
  93. .unwrap();
  94. assert!(error.is_instance_of::<RangeError>());
  95. }
  96. #[wasm_bindgen_test]
  97. fn table() {
  98. let table = WebAssembly::Table::new(&get_table_object().into()).unwrap();
  99. assert_eq!(table.length(), 1);
  100. assert!(table.get(0).is_ok());
  101. assert!(table.get(999).is_err());
  102. table.grow(1).unwrap();
  103. assert_eq!(table.length(), 2);
  104. let f = table.get(0).unwrap();
  105. table.set(1, &f).unwrap();
  106. }
  107. #[wasm_bindgen_test]
  108. fn compile_error_inheritance() {
  109. let error = WebAssembly::CompileError::new("");
  110. assert!(error.is_instance_of::<WebAssembly::CompileError>());
  111. assert!(error.is_instance_of::<Error>());
  112. let _: &Error = error.as_ref();
  113. }
  114. #[wasm_bindgen_test]
  115. fn link_error_inheritance() {
  116. let error = WebAssembly::LinkError::new("");
  117. assert!(error.is_instance_of::<WebAssembly::LinkError>());
  118. assert!(error.is_instance_of::<Error>());
  119. let _: &Error = error.as_ref();
  120. }
  121. #[wasm_bindgen_test]
  122. fn runtime_error_inheritance() {
  123. let error = WebAssembly::RuntimeError::new("");
  124. assert!(error.is_instance_of::<WebAssembly::RuntimeError>());
  125. assert!(error.is_instance_of::<Error>());
  126. let _: &Error = error.as_ref();
  127. }
  128. #[wasm_bindgen_test]
  129. fn webassembly_instance() {
  130. let module = WebAssembly::Module::new(&get_valid_wasm()).unwrap();
  131. let imports = get_imports();
  132. let instance = WebAssembly::Instance::new(&module, &imports).unwrap();
  133. // Inheritance chain is correct.
  134. assert!(instance.is_instance_of::<WebAssembly::Instance>());
  135. assert!(instance.is_instance_of::<Object>());
  136. let _: &Object = instance.as_ref();
  137. // Has expected exports.
  138. let exports = instance.exports();
  139. assert!(Reflect::has(exports.as_ref(), &"exported_func".into()).unwrap());
  140. }
  141. #[wasm_bindgen_test]
  142. async fn instantiate_module() {
  143. let module = WebAssembly::Module::new(&get_valid_wasm()).unwrap();
  144. let imports = get_imports();
  145. let p = WebAssembly::instantiate_module(&module, &imports);
  146. let inst = JsFuture::from(p).await.unwrap();
  147. assert!(inst.is_instance_of::<WebAssembly::Instance>());
  148. }
  149. #[wasm_bindgen_test]
  150. async fn instantiate_streaming() {
  151. let response = Promise::resolve(&get_valid_wasm());
  152. let imports = get_imports();
  153. let p = WebAssembly::instantiate_streaming(&response, &imports);
  154. let obj = JsFuture::from(p).await.unwrap();
  155. assert!(Reflect::get(obj.as_ref(), &"instance".into())
  156. .unwrap()
  157. .is_instance_of::<WebAssembly::Instance>());
  158. }
  159. #[wasm_bindgen_test]
  160. fn memory_works() {
  161. let obj = Object::new();
  162. Reflect::set(obj.as_ref(), &"initial".into(), &1.into()).unwrap();
  163. let mem = WebAssembly::Memory::new(&obj).unwrap();
  164. assert!(mem.is_instance_of::<WebAssembly::Memory>());
  165. assert!(mem.is_instance_of::<Object>());
  166. assert!(mem.buffer().is_instance_of::<ArrayBuffer>());
  167. assert_eq!(mem.grow(1), 1);
  168. assert_eq!(mem.grow(2), 2);
  169. assert_eq!(mem.grow(3), 4);
  170. assert_eq!(
  171. mem.buffer()
  172. .dyn_into::<ArrayBuffer>()
  173. .unwrap()
  174. .byte_length(),
  175. 7 * 64 * 1024,
  176. );
  177. }