Home Reference Source Repository

src/tools/__tests__/testEditDistance-test.js

/**
 * Copyright (c) 2013-present, Facebook, Inc.
 * All rights reserved.
 *
 * This source code is licensed under the BSD-style license found in the
 * LICENSE file in the root directory of this source tree. An additional grant
 * of patent rights can be found in the PATENTS file in the same directory.
 *
 * @emails oncall+relay
 */

'use strict';

const testEditDistance = require('testEditDistance');

describe('testEditDistance()', () => {
  it('considers empty strings to be identical', () => {
    expect(testEditDistance('', '', 0)).toBe(true);
  });

  it('detects non-empty identical strings', () => {
    expect(testEditDistance('foo', 'foo', 0)).toBe(true);
  });

  it('works with one empty and one non-empty string', () => {
    expect(testEditDistance('', 'foo', 2)).toBe(false);
    expect(testEditDistance('', 'foo', 3)).toBe(true);
    expect(testEditDistance('foo', '', 2)).toBe(false);
    expect(testEditDistance('foo', '', 3)).toBe(true);
  });

  it('detects deletions', () => {
    expect(testEditDistance('foobar', 'fbar', 1)).toBe(false);
    expect(testEditDistance('foobar', 'fbar', 2)).toBe(true);
  });

  it('detects insertions', () => {
    expect(testEditDistance('foo', '<foo>', 1)).toBe(false);
    expect(testEditDistance('foo', '<foo>', 2)).toBe(true);
  });

  it('detects substitutions', () => {
    expect(testEditDistance('foobar', 'FooBar', 1)).toBe(false);
    expect(testEditDistance('foobar', 'FooBar', 2)).toBe(true);
  });

  it('detects adjacent transpositions', () => {
    expect(testEditDistance('foobar', 'foboar', 0)).toBe(false);
    expect(testEditDistance('foobar', 'foboar', 1)).toBe(true);
  });

  it('treats non-adjacent transposition as unrelated operations', () => {
    expect(testEditDistance('foobar', 'boofar', 1)).toBe(false);
    expect(testEditDistance('foobar', 'boofar', 2)).toBe(true);
  });

  it('detects distances involving multiple edit operations', () => {
    expect(
      testEditDistance(
        'String involving multiple changes.',
        'strni ginvolvinG mmultiple cangs!',
        7
      )
    ).toBe(false);
    expect(
      testEditDistance(
        'String involving multiple changes.',
        'strni ginvolvinG mmultiple cangs!',
        8
      )
    ).toBe(true);
  });
});