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

Blokh
Hey guys, I’ve got a huge CSV ( around 10 GB ) that needs to be processed hourly Do you guys have any suggestions what is the best prac...
New
RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
kszambelanczyk
Hello! Could someone please give me a help/sample code, how to delete a file from s3 using waffle/waffle_ecto from Phoenix app. I creat...
New
RemyXRenard
I’m seeing that a list inside a Kino.DataTable will be interpreted as a charlist, even if the Kino.configure() is set to charlists: :as_l...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
samoloth
Hi, I’ve just set up an application with ash_authentication. There is only magic link strategy for now, so there is no confirmation add o...
New
FlyingNoodle
If a change or preparation module uses Ash.Changeset.get_argument/2 or Ash.Query.get_argument/2 (or any of the other get_argument functio...
New

Other Trending Topics Top

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
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge &amp; Solve. They are GUI (Emerge) and State management (S...
New
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews