PathrockNetwork Gno Explorer
HomeBlocksTransactionsTokensRealmsPackagesValidatorsAnalytics

PathrockNetwork Gno Explorer — an independent explorer for Gno.land Mainnet (gnoland-1), operated by PathrockNetwork. Not an official Gno.land service.

gnowebarchive RPC

gno.land/p/onbloc/diff/v0

Package
Open in gnoweb ↗

Overview

Kind
Pure package
Name
v0
Namespace
onbloc / diff
Files
3 (gnomod.toml)
Exported functions
n/a — not supported for pure packages by the node (vm/qfuncs)
Module
gno.land/p/onbloc/diff/v0
gno
0.9

Files (3)

  • gnomod.tomltoml
  • diff.gnogno
  • diff_test.gnogno
diff_test.gnogno
1package diff23import (4	"strings"5	"testing"6)78func TestMyersDiff(t *testing.T) {9	tests := []struct {10		name     string11		old      string12		new      string13		expected string14	}{15		{16			name:     "No difference",17			old:      "abc",18			new:      "abc",19			expected: "abc",20		},21		{22			name:     "Simple insertion",23			old:      "ac",24			new:      "abc",25			expected: "a[+b]c",26		},27		{28			name:     "Simple deletion",29			old:      "abc",30			new:      "ac",31			expected: "a[-b]c",32		},33		{34			name:     "Simple substitution",35			old:      "abc",36			new:      "abd",37			expected: "ab[-c][+d]",38		},39		{40			name:     "Multiple changes",41			old:      "The quick brown fox jumps over the lazy dog",42			new:      "The quick brown cat jumps over the lazy dog",43			expected: "The quick brown [-fox][+cat] jumps over the lazy dog",44		},45		{46			name:     "Prefix and suffix",47			old:      "Hello, world!",48			new:      "Hello, beautiful world!",49			expected: "Hello, [+beautiful ]world!",50		},51		{52			name:     "Complete change",53			old:      "abcdef",54			new:      "ghijkl",55			expected: "[-abcdef][+ghijkl]",56		},57		{58			name:     "Empty strings",59			old:      "",60			new:      "",61			expected: "",62		},63		{64			name:     "Old empty",65			old:      "",66			new:      "abc",67			expected: "[+abc]",68		},69		{70			name:     "New empty",71			old:      "abc",72			new:      "",73			expected: "[-abc]",74		},75		{76			name:     "non-ascii (Korean characters)",77			old:      "ASCII 문자가 아닌 것도 되나?",78			new:      "ASCII 문자가 아닌 것도 됨.",79			expected: "ASCII 문자가 아닌 것도 [-되나?][+됨.]",80		},81		{82			name:     "Emoji diff",83			old:      "Hello 👋 World 🌍",84			new:      "Hello 👋 Beautiful 🌸 World 🌍",85			expected: "Hello 👋 [+Beautiful 🌸 ]World 🌍",86		},87		{88			name:     "Mixed multibyte and ASCII",89			old:      "こんにちは World",90			new:      "こんばんは World",91			expected: "こん[-にち][+ばん]は World",92		},93		{94			name:     "Chinese characters",95			old:      "我喜欢编程",96			new:      "我喜欢看书和编程",97			expected: "我喜欢[+看书和]编程",98		},99		{100			name:     "Combining characters",101			old:      "e\u0301", // é (e + ´)102			new:      "e\u0300", // è (e + `)103			expected: "e[-\u0301][+\u0300]",104		},105		{106			name:     "Right-to-Left languages",107			old:      "שלום",108			new:      "שלום עולם",109			expected: "שלום[+ עולם]",110		},111		{112			name:     "Normalization NFC and NFD",113			old:      "e\u0301", // NFD (decomposed)114			new:      "\u00e9",  // NFC (precomposed)115			expected: "[-e\u0301][+\u00e9]",116		},117		{118			name:     "Case sensitivity",119			old:      "abc",120			new:      "Abc",121			expected: "[-a][+A]bc",122		},123		{124			name:     "Surrogate pairs",125			old:      "Hello 🌍",126			new:      "Hello 🌎",127			expected: "Hello [-🌍][+🌎]",128		},129		{130			name:     "Control characters",131			old:      "Line1\nLine2",132			new:      "Line1\r\nLine2",133			expected: "Line1[+\r]\nLine2",134		},135		{136			name:     "Mixed scripts",137			old:      "Hello नमस्ते こんにちは",138			new:      "Hello สวัสดี こんにちは",139			expected: "Hello [-नमस्ते][+สวัสดี] こんにちは",140		},141		{142			name:     "Unicode normalization",143			old:      "é",       // U+00E9 (precomposed)144			new:      "e\u0301", // U+0065 U+0301 (decomposed)145			expected: "[-é][+e\u0301]",146		},147		{148			name:     "Directional marks",149			old:      "Hello\u200Eworld", // LTR mark150			new:      "Hello\u200Fworld", // RTL mark151			expected: "Hello[-\u200E][+\u200F]world",152		},153		{154			name:     "Zero-width characters",155			old:      "ab\u200Bc", // Zero-width space156			new:      "abc",157			expected: "ab[-\u200B]c",158		},159		{160			name:     "Worst-case scenario (completely different strings)",161			old:      strings.Repeat("a", 1000),162			new:      strings.Repeat("b", 1000),163			expected: "[-" + strings.Repeat("a", 1000) + "][+" + strings.Repeat("b", 1000) + "]",164		},165		//{ // disabled for testing performance166		// XXX: consider adding a flag to run such tests, not like `-short`, or switching to a `-bench`, maybe.167		//	name:     "Very long strings",168		//	old:      strings.Repeat("a", 10000) + "b" + strings.Repeat("a", 10000),169		//	new:      strings.Repeat("a", 10000) + "c" + strings.Repeat("a", 10000),170		//	expected: strings.Repeat("a", 10000) + "[-b][+c]" + strings.Repeat("a", 10000),171		//},172	}173174	for _, tc := range tests {175		t.Run(tc.name, func(t *testing.T) {176			diff := MyersDiff(tc.old, tc.new)177			result := Format(diff)178			if result != tc.expected {179				t.Errorf("Expected: %s, got: %s", tc.expected, result)180			}181		})182	}183}184

Functions

not supported for pure packages by the node (vm/qfuncs)

Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.