Skip to content

Commit 9a67b0c

Browse files
committed
Object.assign documentation and tests
1 parent 49537f2 commit 9a67b0c

File tree

5 files changed

+131
-5
lines changed

5 files changed

+131
-5
lines changed

src/Core__Object.res

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,26 @@
77
@val external createWithNull: (@as(json`null`) _, unit) => {..} = "Object.create"
88
@val external createWithNullAndProperties: (@as(json`null`) _, {..}) => {..} = "Object.create"
99

10-
@val external assign: ({..}, {..}) => {..} = "Object.assign"
11-
@variadic @val external assignMany: ({..}, array<{..}>) => {..} = "Object.assign"
10+
/**
11+
`assign(target, source)` copies enumerable own properties from the source to the target, overwriting properties with the same name. It returns the modified target object. A deep clone is not created; properties are copied by reference.
12+
13+
**Note:** ReScript provides [first-class support for immutable objects](https://rescript-lang.org/docs/manual/latest/object), including spreading one object into another. This is often more convenient than using `assign`.
14+
15+
## Examples
16+
17+
```rescript
18+
Object.assign({"a": 1}, {"a": 2}) // {"a": 2}
19+
Object.assign({"a": 1, "b": 2}, {"a": 0}) // {"a": 0, "b": 2}
20+
Object.assign({"a": 1}, {"a": null}) // {"a": null}
21+
```
22+
## Specifications
23+
- [ECMAScript Language Specification](https://tc39.es/ecma262/multipage/fundamental-objects.html#sec-object.assign)
24+
- [Object.assign on MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
25+
*/
26+
@val
27+
external assign: ({..}, {..}) => {..} = "Object.assign"
28+
@variadic @val
29+
external assignMany: ({..}, array<{..}>) => {..} = "Object.assign"
1230
@val external copy: (@as(json`{}`) _, {..}) => {..} = "Object.assign"
1331

1432
@get_index external get: ({..}, string) => option<'a> = ""

test/ObjectTests.mjs

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
// Generated by ReScript, PLEASE EDIT WITH CARE
2+
3+
import * as Test from "./Test.mjs";
4+
import * as Caml_obj from "rescript/lib/es6/caml_obj.js";
5+
6+
var eq = Caml_obj.equal;
7+
8+
Test.run([
9+
[
10+
"ObjectTests.res",
11+
8,
12+
13,
13+
50
14+
],
15+
"assign copies from source to target"
16+
], Object.assign({
17+
a: 1,
18+
b: 2
19+
}, {
20+
b: 3,
21+
c: 0
22+
}), eq, {
23+
a: 1,
24+
b: 3,
25+
c: 0
26+
});
27+
28+
function assignOverwritesTarget(title, source) {
29+
var sourceObj = {
30+
a: source
31+
};
32+
Test.run([
33+
[
34+
"ObjectTests.res",
35+
16,
36+
22,
37+
39
38+
],
39+
"assign " + title + ""
40+
], Object.assign({
41+
a: 1
42+
}, sourceObj), eq, sourceObj);
43+
Test.run([
44+
[
45+
"ObjectTests.res",
46+
17,
47+
22,
48+
39
49+
],
50+
"assign " + title + ""
51+
], Object.assign({
52+
a: undefined
53+
}, sourceObj), eq, sourceObj);
54+
Test.run([
55+
[
56+
"ObjectTests.res",
57+
18,
58+
22,
59+
39
60+
],
61+
"assign " + title + ""
62+
], Object.assign({
63+
a: null
64+
}, sourceObj), eq, sourceObj);
65+
}
66+
67+
assignOverwritesTarget("when source is undefined", undefined);
68+
69+
assignOverwritesTarget("when source is null", null);
70+
71+
assignOverwritesTarget("when source is a number", 1);
72+
73+
assignOverwritesTarget("when source is a string", "abc");
74+
75+
export {
76+
eq ,
77+
assignOverwritesTarget ,
78+
}
79+
/* Not a pure module */

test/ObjectTests.res

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
open RescriptCore
2+
3+
let eq = (a, b) => a == b
4+
5+
// ====== assign ======
6+
7+
Test.run(
8+
__POS_OF__("assign copies from source to target"),
9+
Object.assign({"a": 1, "b": 2}, {"b": 3, "c": 0}),
10+
eq,
11+
{"a": 1, "b": 3, "c": 0},
12+
)
13+
14+
let assignOverwritesTarget = (~title, ~source) => {
15+
let sourceObj = {"a": source}
16+
Test.run(__POS_OF__(`assign ${title}`), Object.assign({"a": 1}, sourceObj), eq, sourceObj)
17+
Test.run(__POS_OF__(`assign ${title}`), Object.assign({"a": undefined}, sourceObj), eq, sourceObj)
18+
Test.run(__POS_OF__(`assign ${title}`), Object.assign({"a": null}, sourceObj), eq, sourceObj)
19+
}
20+
21+
assignOverwritesTarget(~title="when source is undefined", ~source=undefined)
22+
assignOverwritesTarget(~title="when source is null", ~source=null)
23+
assignOverwritesTarget(~title="when source is a number", ~source=1)
24+
assignOverwritesTarget(~title="when source is a string", ~source="abc")

test/TestSuite.mjs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import * as IntTests from "./IntTests.mjs";
44
import * as TestTests from "./TestTests.mjs";
55
import * as ArrayTests from "./ArrayTests.mjs";
66
import * as ErrorTests from "./ErrorTests.mjs";
7+
import * as ObjectTests from "./ObjectTests.mjs";
78
import * as PromiseTest from "./PromiseTest.mjs";
89

910
var bign = TestTests.bign;
@@ -26,10 +27,12 @@ var Concurrently = PromiseTest.Concurrently;
2627

2728
var panicTest = ErrorTests.panicTest;
2829

29-
var eq = IntTests.eq;
30-
3130
var $$catch = IntTests.$$catch;
3231

32+
var eq = ObjectTests.eq;
33+
34+
var assignOverwritesTarget = ObjectTests.assignOverwritesTarget;
35+
3336
export {
3437
bign ,
3538
TestError ,
@@ -41,7 +44,8 @@ export {
4144
Catching ,
4245
Concurrently ,
4346
panicTest ,
44-
eq ,
4547
$$catch ,
48+
eq ,
49+
assignOverwritesTarget ,
4650
}
4751
/* IntTests Not a pure module */

test/TestSuite.res

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ include PromiseTest
33
include ErrorTests
44
include ArrayTests
55
include IntTests
6+
include ObjectTests

0 commit comments

Comments
 (0)