diff --git a/lib/versioning/poetry/index.spec.ts b/lib/versioning/poetry/index.spec.ts
index 2db974e4cd3a383591e866161e42cdff5ce1f3f4..6f9d3a999e5794cde237177955718e2c4b207964 100644
--- a/lib/versioning/poetry/index.spec.ts
+++ b/lib/versioning/poetry/index.spec.ts
@@ -2,608 +2,210 @@ import { api as versioning } from '.';
 
 describe('versioning/poetry/index', () => {
   describe('equals', () => {
-    it.each([
-      ['1', '1'],
-      ['1.0', '1'],
-      ['1.0.0', '1'],
-      ['1.9.0', '1.9'],
-    ])('%s == %s', (a, b) => {
-      expect(versioning.equals(a, b)).toBe(true);
-    });
-
-    it.each([
-      ['1', '2'],
-      ['1.9.1', '1.9'],
-      ['1.9-beta', '1.9'],
-    ])('%s != %s', (a, b) => {
-      expect(versioning.equals(a, b)).toBe(false);
+    test.each`
+      a             | b        | expected
+      ${'1'}        | ${'1'}   | ${true}
+      ${'1.0'}      | ${'1'}   | ${true}
+      ${'1.0.0'}    | ${'1'}   | ${true}
+      ${'1.9.0'}    | ${'1.9'} | ${true}
+      ${'1'}        | ${'2'}   | ${false}
+      ${'1.9.1'}    | ${'1.9'} | ${false}
+      ${'1.9-beta'} | ${'1.9'} | ${false}
+    `('equals("$a", "$b") === $expected', ({ a, b, expected }) => {
+      expect(versioning.equals(a, b)).toBe(expected);
     });
   });
 
-  describe('getMajor', () => {
-    it.each([
-      ['1', 1],
-      ['1.9', 1],
-      ['1.9.0', 1],
-    ])('%s -> %i', (version, expected) => {
-      expect(versioning.getMajor(version)).toEqual(expected);
-    });
-  });
+  test.each`
+    version    | major | minor | patch
+    ${'1'}     | ${1}  | ${0}  | ${0}
+    ${'1.9'}   | ${1}  | ${9}  | ${0}
+    ${'1.9.0'} | ${1}  | ${9}  | ${0}
+    ${'1.9.4'} | ${1}  | ${9}  | ${4}
+  `(
+    'getMajor, getMinor, getPatch for "$version"',
+    ({ version, major, minor, patch }) => {
+      expect(versioning.getMajor(version)).toBe(major);
+      expect(versioning.getMinor(version)).toBe(minor);
+      expect(versioning.getPatch(version)).toBe(patch);
+    }
+  );
 
-  describe('getMinor', () => {
-    it.each([
-      ['1', 0],
-      ['1.9', 9],
-      ['1.9.0', 9],
-    ])('%s -> %i', (version, expected) => {
-      expect(versioning.getMinor(version)).toEqual(expected);
-    });
+  test.each`
+    a           | b             | expected
+    ${'2'}      | ${'1'}        | ${true}
+    ${'2.0'}    | ${'1'}        | ${true}
+    ${'2.0.0'}  | ${'1'}        | ${true}
+    ${'1.10.0'} | ${'1.9'}      | ${true}
+    ${'1.9'}    | ${'1.9-beta'} | ${true}
+    ${'1'}      | ${'1'}        | ${false}
+    ${'1.0'}    | ${'1'}        | ${false}
+    ${'1.0.0'}  | ${'1'}        | ${false}
+    ${'1.9.0'}  | ${'1.9'}      | ${false}
+  `('isGreaterThan("$a", "$b") === $expected', ({ a, b, expected }) => {
+    expect(versioning.isGreaterThan(a, b)).toBe(expected);
   });
 
-  describe('getPatch', () => {
-    it.each([
-      ['1', 0],
-      ['1.9', 0],
-      ['1.9.0', 0],
-      ['1.9.4', 4],
-    ])('%s -> %i', (version, expected) => {
-      expect(versioning.getPatch(version)).toEqual(expected);
-    });
+  test.each`
+    version         | expected
+    ${'1'}          | ${true}
+    ${'1.9'}        | ${true}
+    ${'1.9.0'}      | ${true}
+    ${'1.9.4'}      | ${true}
+    ${'1.9.4-beta'} | ${false}
+  `('isStable("$version") === $expected', ({ version, expected }) => {
+    const res = !!versioning.isStable(version);
+    expect(res).toBe(expected);
   });
 
-  describe('isGreaterThan', () => {
-    it.each([
-      ['2', '1'],
-      ['2.0', '1'],
-      ['2.0.0', '1'],
-      ['1.10.0', '1.9'],
-      ['1.9', '1.9-beta'],
-    ])('%s > %s', (a, b) => {
-      expect(versioning.isGreaterThan(a, b)).toBe(true);
-    });
-
-    it.each([
-      ['1', '1'],
-      ['1.0', '1'],
-      ['1.0.0', '1'],
-      ['1.9.0', '1.9'],
-    ])('%s <= %s', (a, b) => {
-      expect(versioning.isGreaterThan(a, b)).toBe(false);
-    });
+  test.each`
+    version                                          | expected
+    ${'17.04.0'}                                     | ${false}
+    ${'1.2.3'}                                       | ${true}
+    ${'1.2.3-foo'}                                   | ${true}
+    ${'1.2.3foo'}                                    | ${false}
+    ${'*'}                                           | ${true}
+    ${'~1.2.3'}                                      | ${true}
+    ${'^1.2.3'}                                      | ${true}
+    ${'>1.2.3'}                                      | ${true}
+    ${'renovatebot/renovate'}                        | ${false}
+    ${'renovatebot/renovate#master'}                 | ${false}
+    ${'https://github.com/renovatebot/renovate.git'} | ${false}
+  `('isValid("$version") === $expected', ({ version, expected }) => {
+    expect(!!versioning.isValid(version)).toBe(expected);
   });
 
-  describe('isStable', () => {
-    it.each([
-      ['1', true],
-      ['1.9', true],
-      ['1.9.0', true],
-      ['1.9.4', true],
-      ['1.9.4-beta', false],
-    ])('%s -> %i', (version, expected) => {
-      expect(versioning.isStable(version)).toEqual(expected);
-    });
+  test.each`
+    version            | expected
+    ${'1.2.3'}         | ${true}
+    ${'1.2.3-alpha.1'} | ${true}
+    ${'=1.2.3'}        | ${true}
+    ${'= 1.2.3'}       | ${true}
+    ${'1.*'}           | ${false}
+  `('isSingleVersion("$version") === $expected', ({ version, expected }) => {
+    expect(!!versioning.isSingleVersion(version)).toBe(expected);
   });
 
-  describe('isValid(input)', () => {
-    it('should return null for irregular versions', () => {
-      expect(versioning.isValid('17.04.0')).toBeFalsy();
-    });
-    it('should support simple semver', () => {
-      expect(versioning.isValid('1.2.3')).toBeTruthy();
-    });
-    it('should support semver with dash', () => {
-      expect(versioning.isValid('1.2.3-foo')).toBeTruthy();
-    });
-    it('should reject semver without dash', () => {
-      expect(versioning.isValid('1.2.3foo')).toBeFalsy();
-    });
-    it('should work with wildcards', () => {
-      expect(versioning.isValid('*')).toBeTruthy();
-    });
-    it('should support ranges', () => {
-      expect(versioning.isValid('~1.2.3')).toBeTruthy();
-      expect(versioning.isValid('^1.2.3')).toBeTruthy();
-      expect(versioning.isValid('>1.2.3')).toBeTruthy();
-    });
-    it('should reject github repositories', () => {
-      expect(versioning.isValid('renovatebot/renovate')).toBeFalsy();
-      expect(versioning.isValid('renovatebot/renovate#master')).toBeFalsy();
-      expect(
-        versioning.isValid('https://github.com/renovatebot/renovate.git')
-      ).toBeFalsy();
-    });
-  });
-  describe('isSingleVersion()', () => {
-    it('returns true if naked version', () => {
-      expect(versioning.isSingleVersion('1.2.3')).toBeTruthy();
-      expect(versioning.isSingleVersion('1.2.3-alpha.1')).toBeTruthy();
-    });
-    it('returns true if equals', () => {
-      expect(versioning.isSingleVersion('=1.2.3')).toBeTruthy();
-      expect(versioning.isSingleVersion('= 1.2.3')).toBeTruthy();
-    });
-    it('returns false when not version', () => {
-      expect(versioning.isSingleVersion('1.*')).toBeFalsy();
-    });
-  });
-  describe('matches()', () => {
-    it('handles comma', () => {
-      expect(versioning.matches('4.2.0', '4.2, >= 3.0, < 5.0.0')).toBe(true);
-      expect(versioning.matches('4.2.0', '2.0, >= 3.0, < 5.0.0')).toBe(false);
-      expect(versioning.matches('4.2.2', '4.2.0, < 4.2.4')).toBe(false);
-      expect(versioning.matches('4.2.2', '^4.2.0, < 4.2.4')).toBe(true);
-      expect(versioning.matches('4.2.0', '4.3.0, 3.0.0')).toBe(false);
-      expect(versioning.matches('4.2.0', '> 5.0.0, <= 6.0.0')).toBe(false);
-    });
-    it('handles wildcards', () => {
-      expect(versioning.matches('4.2.0', '*')).toBe(true);
-    });
-    it('handles short', () => {
-      expect(versioning.matches('1.4', '1.4')).toBe(true);
-    });
-  });
-  describe('isLessThanRange()', () => {
-    it('handles comma', () => {
-      expect(versioning.isLessThanRange('0.9.0', '>= 1.0.0 <= 2.0.0')).toBe(
-        true
-      );
-      expect(versioning.isLessThanRange('1.9.0', '>= 1.0.0 <= 2.0.0')).toBe(
-        false
-      );
-    });
-  });
-  describe('minSatisfyingVersion()', () => {
-    it('handles comma', () => {
-      expect(
-        versioning.minSatisfyingVersion(
-          ['0.4.0', '0.5.0', '4.2.0', '4.3.0', '5.0.0'],
-          '4.*, > 4.2'
-        )
-      ).toBe('4.3.0');
-      expect(
-        versioning.minSatisfyingVersion(
-          ['0.4.0', '0.5.0', '4.2.0', '5.0.0'],
-          '^4.0.0'
-        )
-      ).toBe('4.2.0');
-      expect(
-        versioning.minSatisfyingVersion(
-          ['0.4.0', '0.5.0', '4.2.0', '5.0.0'],
-          '^4.0.0, = 0.5.0'
-        )
-      ).toBeNull();
-      expect(
-        versioning.minSatisfyingVersion(
-          ['0.4.0', '0.5.0', '4.2.0', '5.0.0'],
-          '^4.0.0, > 4.1.0, <= 4.3.5'
-        )
-      ).toBe('4.2.0');
-      expect(
-        versioning.minSatisfyingVersion(
-          ['0.4.0', '0.5.0', '4.2.0', '5.0.0'],
-          '^6.2.0, 3.*'
-        )
-      ).toBeNull();
-    });
-  });
-  describe('getSatisfyingVersion()', () => {
-    it('handles comma', () => {
-      expect(
-        versioning.getSatisfyingVersion(
-          ['4.2.1', '0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0'],
-          '4.*.0, < 4.2.5'
-        )
-      ).toBe('4.2.1');
-      expect(
-        versioning.getSatisfyingVersion(
-          ['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0', '5.0.3'],
-          '5.0, > 5.0.0'
-        )
-      ).toBe('5.0.3');
-    });
-  });
+  test.each`
+    version    | range                     | expected
+    ${'4.2.0'} | ${'4.2, >= 3.0, < 5.0.0'} | ${true}
+    ${'4.2.0'} | ${'2.0, >= 3.0, < 5.0.0'} | ${false}
+    ${'4.2.2'} | ${'4.2.0, < 4.2.4'}       | ${false}
+    ${'4.2.2'} | ${'^4.2.0, < 4.2.4'}      | ${true}
+    ${'4.2.0'} | ${'4.3.0, 3.0.0'}         | ${false}
+    ${'4.2.0'} | ${'> 5.0.0, <= 6.0.0'}    | ${false}
+    ${'4.2.0'} | ${'*'}                    | ${true}
+    ${'1.4'}   | ${'1.4'}                  | ${true}
+  `(
+    'matches("$version", "$range") === "$expected"',
+    ({ version, range, expected }) => {
+      expect(versioning.matches(version, range)).toBe(expected);
+    }
+  );
 
-  describe('getNewValue()', () => {
-    it('bumps exact', () => {
-      expect(
-        versioning.getNewValue({
-          currentValue: '1.0.0',
-          rangeStrategy: 'bump',
-          currentVersion: '1.0.0',
-          newVersion: '1.1.0',
-        })
-      ).toEqual('1.1.0');
-      expect(
-        versioning.getNewValue({
-          currentValue: '   1.0.0',
-          rangeStrategy: 'bump',
-          currentVersion: '1.0.0',
-          newVersion: '1.1.0',
-        })
-      ).toEqual('1.1.0');
-      expect(
-        versioning.getNewValue({
-          currentValue: '1.0.0',
-          rangeStrategy: 'bump',
-          currentVersion: '1.0.0',
-          newVersion: '1.1.0',
-        })
-      ).toEqual('1.1.0');
-    });
-    it('bumps equals', () => {
-      expect(
-        versioning.getNewValue({
-          currentValue: '=1.0.0',
-          rangeStrategy: 'bump',
-          currentVersion: '1.0.0',
-          newVersion: '1.1.0',
-        })
-      ).toEqual('=1.1.0');
-      expect(
-        versioning.getNewValue({
-          currentValue: '=  1.0.0',
-          rangeStrategy: 'bump',
-          currentVersion: '1.0.0',
-          newVersion: '1.1.0',
-        })
-      ).toEqual('=1.1.0');
-    });
-    it('bumps equals space', () => {
-      expect(
-        versioning.getNewValue({
-          currentValue: '= 1.0.0',
-          rangeStrategy: 'bump',
-          currentVersion: '1.0.0',
-          newVersion: '1.1.0',
-        })
-      ).toEqual('=1.1.0');
-      expect(
-        versioning.getNewValue({
-          currentValue: '  = 1.0.0',
-          rangeStrategy: 'bump',
-          currentVersion: '1.0.0',
-          newVersion: '1.1.0',
-        })
-      ).toEqual('=1.1.0');
-      expect(
-        versioning.getNewValue({
-          currentValue: '  =   1.0.0',
-          rangeStrategy: 'bump',
-          currentVersion: '1.0.0',
-          newVersion: '1.1.0',
-        })
-      ).toEqual('=1.1.0');
-      expect(
-        versioning.getNewValue({
-          currentValue: '=    1.0.0',
-          rangeStrategy: 'bump',
-          currentVersion: '1.0.0',
-          newVersion: '1.1.0',
-        })
-      ).toEqual('=1.1.0');
-    });
-    it('bumps short caret to same', () => {
-      expect(
-        versioning.getNewValue({
-          currentValue: '^1.0',
-          rangeStrategy: 'bump',
-          currentVersion: '1.0.0',
-          newVersion: '1.0.7',
-        })
-      ).toEqual('^1.0');
-    });
-    it('replaces caret with newer', () => {
-      expect(
-        versioning.getNewValue({
-          currentValue: '^1.0.0',
-          rangeStrategy: 'replace',
-          currentVersion: '1.0.0',
-          newVersion: '2.0.7',
-        })
-      ).toEqual('^2.0.0');
-    });
-    it('handles precision change caret', () => {
-      expect(
-        versioning.getNewValue({
-          currentValue: '^5.0.3',
-          rangeStrategy: 'replace',
-          currentVersion: '5.3.1',
-          newVersion: '5.5',
-        })
-      ).toEqual('^5.0.3');
-    });
-    it('replaces naked version', () => {
-      expect(
-        versioning.getNewValue({
-          currentValue: '1.0.0',
-          rangeStrategy: 'replace',
-          currentVersion: '1.0.0',
-          newVersion: '2.0.7',
-        })
-      ).toEqual('2.0.7');
-    });
-    it('replaces with version range', () => {
-      expect(
-        versioning.getNewValue({
-          currentValue: '^1.0.0',
-          rangeStrategy: 'replace',
-          currentVersion: '1.0.0',
-          newVersion: '2.0.7',
-        })
-      ).toEqual('^2.0.0');
-    });
-    it('returns currentValue', () => {
-      expect(
-        versioning.getNewValue({
-          currentValue: '^0.5.15',
-          rangeStrategy: 'replace',
-          currentVersion: '0.5.15',
-          newVersion: '0.6',
-        })
-      ).toEqual('^0.5.15');
-    });
-    it('bumps naked caret', () => {
-      expect(
-        versioning.getNewValue({
-          currentValue: '^1',
-          rangeStrategy: 'bump',
-          currentVersion: '1.0.0',
-          newVersion: '2.1.7',
-        })
-      ).toEqual('^2');
-    });
-    it('bumps naked tilde', () => {
-      expect(
-        versioning.getNewValue({
-          currentValue: '~1',
-          rangeStrategy: 'bump',
-          currentVersion: '1.0.0',
-          newVersion: '1.1.7',
-        })
-      ).toEqual('~1');
-    });
-    it('bumps naked major', () => {
-      expect(
-        versioning.getNewValue({
-          currentValue: '5',
-          rangeStrategy: 'bump',
-          currentVersion: '5.0.0',
-          newVersion: '5.1.7',
-        })
-      ).toEqual('5');
-      expect(
-        versioning.getNewValue({
-          currentValue: '5',
-          rangeStrategy: 'bump',
-          currentVersion: '5.0.0',
-          newVersion: '6.1.7',
-        })
-      ).toEqual('6');
-    });
-    it('bumps naked minor', () => {
-      expect(
-        versioning.getNewValue({
-          currentValue: '5.0',
-          rangeStrategy: 'bump',
-          currentVersion: '5.0.0',
-          newVersion: '5.0.7',
-        })
-      ).toEqual('5.0');
-      expect(
-        versioning.getNewValue({
-          currentValue: '5.0',
-          rangeStrategy: 'bump',
-          currentVersion: '5.0.0',
-          newVersion: '5.1.7',
-        })
-      ).toEqual('5.1');
-      expect(
-        versioning.getNewValue({
-          currentValue: '5.0',
-          rangeStrategy: 'bump',
-          currentVersion: '5.0.0',
-          newVersion: '6.1.7',
-        })
-      ).toEqual('6.1');
-    });
-    it('replaces minor', () => {
-      expect(
-        versioning.getNewValue({
-          currentValue: '5.0',
-          rangeStrategy: 'replace',
-          currentVersion: '5.0.0',
-          newVersion: '6.1.7',
-        })
-      ).toEqual('6.1');
-    });
-    it('replaces equals', () => {
-      expect(
-        versioning.getNewValue({
-          currentValue: '=1.0.0',
-          rangeStrategy: 'replace',
-          currentVersion: '1.0.0',
-          newVersion: '1.1.0',
-        })
-      ).toEqual('=1.1.0');
-    });
-    it('bumps caret to prerelease', () => {
-      expect(
-        versioning.getNewValue({
-          currentValue: '^1',
-          rangeStrategy: 'bump',
-          currentVersion: '1.0.0',
-          newVersion: '1.0.7-prerelease.1',
-        })
-      ).toEqual('^1.0.7-prerelease.1');
-    });
-    it('replaces with newer', () => {
-      expect(
-        versioning.getNewValue({
-          currentValue: '^1.0.0',
-          rangeStrategy: 'replace',
-          currentVersion: '1.0.0',
-          newVersion: '1.2.3',
-        })
-      ).toEqual('^1.0.0');
-    });
-    it('bumps short tilde', () => {
-      expect(
-        versioning.getNewValue({
-          currentValue: '~1.0',
-          rangeStrategy: 'bump',
-          currentVersion: '1.0.0',
-          newVersion: '1.1.7',
-        })
-      ).toEqual('~1.1');
-    });
-    it('handles long asterisk', () => {
-      expect(
-        versioning.getNewValue({
-          currentValue: '1.0.*',
-          rangeStrategy: 'replace',
-          currentVersion: '1.0.0',
-          newVersion: '1.1.0',
-        })
-      ).toEqual('1.1.*');
-    });
-    it('handles short asterisk', () => {
-      expect(
-        versioning.getNewValue({
-          currentValue: '1.*',
-          rangeStrategy: 'replace',
-          currentVersion: '1.0.0',
-          newVersion: '2.1.0',
-        })
-      ).toEqual('2.*');
-    });
-    it('handles updating from stable to unstable', () => {
-      expect(
-        versioning.getNewValue({
-          currentValue: '~0.6.1',
-          rangeStrategy: 'replace',
-          currentVersion: '0.6.8',
-          newVersion: '0.7.0-rc.2',
-        })
-      ).toEqual('~0.7.0-rc');
-    });
-    it('handles less than version requirements', () => {
-      expect(
-        versioning.getNewValue({
-          currentValue: '<1.3.4',
-          rangeStrategy: 'replace',
-          currentVersion: '1.2.3',
-          newVersion: '1.5.0',
-        })
-      ).toEqual('<1.5.1');
-      expect(
-        versioning.getNewValue({
-          currentValue: '< 1.3.4',
-          rangeStrategy: 'replace',
-          currentVersion: '1.2.3',
-          newVersion: '1.5.0',
-        })
-      ).toEqual('< 1.5.1');
-      expect(
-        versioning.getNewValue({
-          currentValue: '<   1.3.4',
-          rangeStrategy: 'replace',
-          currentVersion: '1.2.3',
-          newVersion: '1.5.0',
-        })
-      ).toEqual('< 1.5.1');
-    });
-    it('handles less than equals version requirements', () => {
-      expect(
-        versioning.getNewValue({
-          currentValue: '<=1.3.4',
-          rangeStrategy: 'replace',
-          currentVersion: '1.2.3',
-          newVersion: '1.5.0',
-        })
-      ).toEqual('<=1.5.0');
-      expect(
-        versioning.getNewValue({
-          currentValue: '<= 1.3.4',
-          rangeStrategy: 'replace',
-          currentVersion: '1.2.3',
-          newVersion: '1.5.0',
-        })
-      ).toEqual('<= 1.5.0');
-      expect(
-        versioning.getNewValue({
-          currentValue: '<=   1.3.4',
-          rangeStrategy: 'replace',
-          currentVersion: '1.2.3',
-          newVersion: '1.5.0',
-        })
-      ).toEqual('<= 1.5.0');
-    });
-    it('handles replacing short caret versions', () => {
-      expect(
-        versioning.getNewValue({
-          currentValue: '^1.2',
-          rangeStrategy: 'replace',
-          currentVersion: '1.2.3',
-          newVersion: '2.0.0',
-        })
-      ).toEqual('^2.0');
-      expect(
-        versioning.getNewValue({
-          currentValue: '^1',
-          rangeStrategy: 'replace',
-          currentVersion: '1.2.3',
-          newVersion: '2.0.0',
-        })
-      ).toEqual('^2');
-    });
-    it('handles replacing short tilde versions', () => {
-      expect(
-        versioning.getNewValue({
-          currentValue: '~1.2',
-          rangeStrategy: 'replace',
-          currentVersion: '1.2.3',
-          newVersion: '2.0.0',
-        })
-      ).toEqual('~2.0');
-      expect(
-        versioning.getNewValue({
-          currentValue: '~1',
-          rangeStrategy: 'replace',
-          currentVersion: '1.2.3',
-          newVersion: '2.0.0',
-        })
-      ).toEqual('~2');
-    });
-    it('widens range', () => {
-      expect(
-        versioning.getNewValue({
-          currentValue: '^2.2',
-          rangeStrategy: 'widen',
-          currentVersion: '2.2.0',
-          newVersion: '3.0.0',
-        })
-      ).toEqual('^2.2 || ^3.0.0');
-    });
-  });
+  test.each`
+    version    | range                  | expected
+    ${'0.9.0'} | ${'>= 1.0.0 <= 2.0.0'} | ${true}
+    ${'1.9.0'} | ${'>= 1.0.0 <= 2.0.0'} | ${false}
+  `(
+    'isLessThanRange("$version", "$range") === "$expected"',
+    ({ version, range, expected }) => {
+      expect(versioning.isLessThanRange(version, range)).toBe(expected);
+    }
+  );
 
-  describe('sortVersions()', () => {
-    it.each([
-      ['2', '1'],
-      ['2.0', '1'],
-      ['2.0.0', '1'],
-      ['1.10.0', '1.9'],
-      ['1.9', '1.9-beta'],
-    ])('%s > %s', (a, b) => {
-      expect(versioning.sortVersions(a, b)).toBe(1);
-    });
+  test.each`
+    versions                                         | range                          | expected
+    ${['0.4.0', '0.5.0', '4.2.0', '4.3.0', '5.0.0']} | ${'4.*, > 4.2'}                | ${'4.3.0'}
+    ${['0.4.0', '0.5.0', '4.2.0', '5.0.0']}          | ${'^4.0.0'}                    | ${'4.2.0'}
+    ${['0.4.0', '0.5.0', '4.2.0', '5.0.0']}          | ${'^4.0.0, = 0.5.0'}           | ${null}
+    ${['0.4.0', '0.5.0', '4.2.0', '5.0.0']}          | ${'^4.0.0, > 4.1.0, <= 4.3.5'} | ${'4.2.0'}
+    ${['0.4.0', '0.5.0', '4.2.0', '5.0.0']}          | ${'^6.2.0, 3.*'}               | ${null}
+  `(
+    'minSatisfyingVersion($versions, "$range") === $expected',
+    ({ versions, range, expected }) => {
+      expect(versioning.minSatisfyingVersion(versions, range)).toBe(expected);
+    }
+  );
 
-    it.each([
-      ['1', '1'],
-      ['1.0', '1'],
-      ['1.0.0', '1'],
-      ['1.9.0', '1.9'],
-    ])('%s == %s', (a, b) => {
-      expect(versioning.sortVersions(a, b)).toBe(0);
-    });
+  test.each`
+    versions                                                  | range               | expected
+    ${['4.2.1', '0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0']} | ${'4.*.0, < 4.2.5'} | ${'4.2.1'}
+    ${['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0', '5.0.3']} | ${'5.0, > 5.0.0'}   | ${'5.0.3'}
+  `(
+    'getSatisfyingVersion($versions, "$range") === $expected',
+    ({ versions, range, expected }) => {
+      expect(versioning.getSatisfyingVersion(versions, range)).toBe(expected);
+    }
+  );
+  test.each`
+    currentValue     | rangeStrategy | currentVersion | newVersion              | expected
+    ${'1.0.0'}       | ${'bump'}     | ${'1.0.0'}     | ${'1.1.0'}              | ${'1.1.0'}
+    ${'   1.0.0'}    | ${'bump'}     | ${'1.0.0'}     | ${'1.1.0'}              | ${'1.1.0'}
+    ${'1.0.0'}       | ${'bump'}     | ${'1.0.0'}     | ${'1.1.0'}              | ${'1.1.0'}
+    ${'=1.0.0'}      | ${'bump'}     | ${'1.0.0'}     | ${'1.1.0'}              | ${'=1.1.0'}
+    ${'=  1.0.0'}    | ${'bump'}     | ${'1.0.0'}     | ${'1.1.0'}              | ${'=1.1.0'}
+    ${'= 1.0.0'}     | ${'bump'}     | ${'1.0.0'}     | ${'1.1.0'}              | ${'=1.1.0'}
+    ${'  = 1.0.0'}   | ${'bump'}     | ${'1.0.0'}     | ${'1.1.0'}              | ${'=1.1.0'}
+    ${'  =   1.0.0'} | ${'bump'}     | ${'1.0.0'}     | ${'1.1.0'}              | ${'=1.1.0'}
+    ${'=    1.0.0'}  | ${'bump'}     | ${'1.0.0'}     | ${'1.1.0'}              | ${'=1.1.0'}
+    ${'^1.0'}        | ${'bump'}     | ${'1.0.0'}     | ${'1.0.7'}              | ${'^1.0'}
+    ${'^1.0.0'}      | ${'replace'}  | ${'1.0.0'}     | ${'2.0.7'}              | ${'^2.0.0'}
+    ${'^5.0.3'}      | ${'replace'}  | ${'5.3.1'}     | ${'5.5'}                | ${'^5.0.3'}
+    ${'1.0.0'}       | ${'replace'}  | ${'1.0.0'}     | ${'2.0.7'}              | ${'2.0.7'}
+    ${'^1.0.0'}      | ${'replace'}  | ${'1.0.0'}     | ${'2.0.7'}              | ${'^2.0.0'}
+    ${'^0.5.15'}     | ${'replace'}  | ${'0.5.15'}    | ${'0.6'}                | ${'^0.5.15'}
+    ${'^1'}          | ${'bump'}     | ${'1.0.0'}     | ${'2.1.7'}              | ${'^2'}
+    ${'~1'}          | ${'bump'}     | ${'1.0.0'}     | ${'1.1.7'}              | ${'~1'}
+    ${'5'}           | ${'bump'}     | ${'5.0.0'}     | ${'5.1.7'}              | ${'5'}
+    ${'5'}           | ${'bump'}     | ${'5.0.0'}     | ${'6.1.7'}              | ${'6'}
+    ${'5.0'}         | ${'bump'}     | ${'5.0.0'}     | ${'5.0.7'}              | ${'5.0'}
+    ${'5.0'}         | ${'bump'}     | ${'5.0.0'}     | ${'5.1.7'}              | ${'5.1'}
+    ${'5.0'}         | ${'bump'}     | ${'5.0.0'}     | ${'6.1.7'}              | ${'6.1'}
+    ${'5.0'}         | ${'replace'}  | ${'5.0.0'}     | ${'6.1.7'}              | ${'6.1'}
+    ${'=1.0.0'}      | ${'replace'}  | ${'1.0.0'}     | ${'1.1.0'}              | ${'=1.1.0'}
+    ${'^1'}          | ${'bump'}     | ${'1.0.0'}     | ${'1.0.7-prerelease.1'} | ${'^1.0.7-prerelease.1'}
+    ${'^1.0.0'}      | ${'replace'}  | ${'1.0.0'}     | ${'1.2.3'}              | ${'^1.0.0'}
+    ${'~1.0'}        | ${'bump'}     | ${'1.0.0'}     | ${'1.1.7'}              | ${'~1.1'}
+    ${'1.0.*'}       | ${'replace'}  | ${'1.0.0'}     | ${'1.1.0'}              | ${'1.1.*'}
+    ${'1.*'}         | ${'replace'}  | ${'1.0.0'}     | ${'2.1.0'}              | ${'2.*'}
+    ${'~0.6.1'}      | ${'replace'}  | ${'0.6.8'}     | ${'0.7.0-rc.2'}         | ${'~0.7.0-rc'}
+    ${'<1.3.4'}      | ${'replace'}  | ${'1.2.3'}     | ${'1.5.0'}              | ${'<1.5.1'}
+    ${'< 1.3.4'}     | ${'replace'}  | ${'1.2.3'}     | ${'1.5.0'}              | ${'< 1.5.1'}
+    ${'<   1.3.4'}   | ${'replace'}  | ${'1.2.3'}     | ${'1.5.0'}              | ${'< 1.5.1'}
+    ${'<=1.3.4'}     | ${'replace'}  | ${'1.2.3'}     | ${'1.5.0'}              | ${'<=1.5.0'}
+    ${'<= 1.3.4'}    | ${'replace'}  | ${'1.2.3'}     | ${'1.5.0'}              | ${'<= 1.5.0'}
+    ${'<=   1.3.4'}  | ${'replace'}  | ${'1.2.3'}     | ${'1.5.0'}              | ${'<= 1.5.0'}
+    ${'^1.2'}        | ${'replace'}  | ${'1.2.3'}     | ${'2.0.0'}              | ${'^2.0'}
+    ${'^1'}          | ${'replace'}  | ${'1.2.3'}     | ${'2.0.0'}              | ${'^2'}
+    ${'~1.2'}        | ${'replace'}  | ${'1.2.3'}     | ${'2.0.0'}              | ${'~2.0'}
+    ${'~1'}          | ${'replace'}  | ${'1.2.3'}     | ${'2.0.0'}              | ${'~2'}
+    ${'^2.2'}        | ${'widen'}    | ${'2.2.0'}     | ${'3.0.0'}              | ${'^2.2 || ^3.0.0'}
+  `(
+    'getNewValue("$currentValue", "$rangeStrategy", "$currentVersion", "$newVersion") === "$expected"',
+    ({ currentValue, rangeStrategy, currentVersion, newVersion, expected }) => {
+      const res = versioning.getNewValue({
+        currentValue,
+        rangeStrategy,
+        currentVersion,
+        newVersion,
+      });
+      expect(res).toEqual(expected);
+    }
+  );
+
+  test.each`
+    a           | b             | expected
+    ${'2'}      | ${'1'}        | ${1}
+    ${'2.0'}    | ${'1'}        | ${1}
+    ${'2.0.0'}  | ${'1'}        | ${1}
+    ${'1.10.0'} | ${'1.9'}      | ${1}
+    ${'1.9'}    | ${'1.9-beta'} | ${1}
+    ${'1'}      | ${'1'}        | ${0}
+    ${'1.0'}    | ${'1'}        | ${0}
+    ${'1.0.0'}  | ${'1'}        | ${0}
+    ${'1.9.0'}  | ${'1.9'}      | ${0}
+  `('sortVersions("$a", "$b") === $expected', ({ a, b, expected }) => {
+    expect(versioning.sortVersions(a, b)).toEqual(expected);
   });
 });