Kaweeda

Kaweeda

Trying to write a property based test to prove ‘js_lib.patch(json_a, elixir_lib.diff(json_a, json_b)) == json_b’

  • a , b are maps and I need to check if the diff of (a,b) is equal to b.

Showing Posts 1 to 4

Qqwy

Qqwy

TypeCheck Core Team

I think something like this should probably be close to what you are looking for:

defmodule MyDiffingToolTest
  use ExUnit, async: true
  use ExUnitProperties
  import StreamData

  property "the Elixir tool works the same as the JS tool" do
    check all map_a <- map_of(term(), term()),
              map_b <- map_of(term(), term()) do
      assert JsLib.diff(map_a, map_b) == ElixirLib.diff(map_a, map_b)
    end
  end
end

And then inside JsLib you’d have some Elixir code that invokes the JS tool from within Elixir.
You might need to change term() into something like one_of([integer(), boolean(), string(), nil]) to restrict the types to only have things that can be JSON-encoded.

Writing a generator that can generate deeply nested JSON objects/arrays is also possible, but takes a little more work. (C.f. StreamData.tree/2)

Qqwy

Qqwy

TypeCheck Core Team

An example of generating JSON using StreamData.
(This might be cleaned up slightly, but could provide a nice starting point.)

Livebook

Setup

Mix.install([
  :stream_data,
  :jason
])
:ok

StreamData JSON generator

import StreamData

# JSON 'supports' integers by secretly treating them 
# as if they were 64-bit floating point numbers.
#
# This means we can (only) safely store integers that are smaller than 2**53.
# Larger integers might (implementation-dependent) result in incorrect rounding.
valid_integer = integer(-(2 ** 53)..(2 ** 53 - 1))

primitive = one_of([valid_integer, float(), string(:printable), boolean(), nil])

json_fragment_gen =
  tree(primitive, fn child_gen ->
    StreamData.one_of([
      # A JSON array
      list_of(child_gen),
      # A JSON object. Only supports string keys.
      map_of(string(:printable), child_gen)
    ])
  end)

# Only valid top-level JSON are objects and arrays
json_gen = json_fragment_gen |> filter(fn val -> is_map(val) || is_list(val) end, 100)

# If you want to directly turn this into a JSON string:
json_string_gen =
  StreamData.map(json_gen, &Jason.encode!(&1, escape: :javascript_safe, pretty: true))

Enum.take(json_string_gen, 10)
["{\n  \"\": null\n}", "[]", "{\n  \"񚏞𭘸\": null\n}", "[]", "{}", "[\n  {},\n  {}\n]", "[]",
 "[\n  [\n    -1022274371879688,\n    {\n      \"𙦿\": -2745706130430791,\n      \"򢗟󰤳\": true\n    }\n  ],\n  {\n    \"\": [\n      7941802212603036\n    ],\n    \"𮿽\": {\n      \"\": false,\n      \"򨋘\": -0.88671875\n    }\n  }\n]",
 "{\n  \"񲼐򋊂󏪀\": [\n    null,\n    true\n  ],\n  \"򠤝򦋏\": {\n    \"\": null,\n    \"򕬱񳰎\": \"򾅶𮝤󂸘򼷭򔦊\"\n  },\n  \"󦼣񎌄򑉿򍑁󷞒\": {\n    \"񧡨\": false\n  },\n  \"􂨮󻉣󘱆\": []\n}",
 "{\n  \"䭦\": null\n}"]
Kaweeda

Kaweeda OP

Hi, thank you this is helpful. I am using this library for the diffing : GitHub - olafura/json_diff_ex: Diff for JSON in Elixir · GitHub. I want to check if the diff(a,b) is equal to be, I might have miswrote. I believe what you wrote is checking both JS library’s diffing and the elixir diffing of a , b. First week using elixir so thank you for being patient with me.

Kaweeda

Kaweeda OP

Unless I am the one who misunderstood

— All posts loaded —

Where Next? Top

Trending in Questions Top

katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
achenet
Hello, I’m trying to build a basic Phoenix web-app, and I’d like to use Tailwind. However, when I launch mix phx.server, I get an error...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
Cxx-mlr
I’m working on a small exercise involving update_in/3, and I came up with this solution: data = %{ name: "Periodic Table", category:...
New
ChrisAmelia
I’ve got trouble wrapping my head around the order in which functions are called in this snippet (from Phoenix’s authentication): toke...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews