Skip to content

Instantly share code, notes, and snippets.

@yoshixmk
Last active June 6, 2020 04:46
Show Gist options
  • Select an option

  • Save yoshixmk/ffea311b9d54a30ee81504b66a61c6d6 to your computer and use it in GitHub Desktop.

Select an option

Save yoshixmk/ffea311b9d54a30ee81504b66a61c6d6 to your computer and use it in GitHub Desktop.
jamashita
import {
assert,
assertEquals,
assertNotEquals,
} from "https://deno.land/std/testing/asserts.ts";
import { Semver } from "./semantic-versioning.ts";
Deno.test("gt より大きい時はtrueを返す", () => {
const semver1 = Semver.ofString("1.2.3");
const semver2 = Semver.ofString("1.2.4");
const semver3 = Semver.ofString("2.2.4");
assert(semver2.gt(semver1));
assert(semver3.gt(semver2));
})
Deno.test("gt より大きくない時はfalseを返す", () => {
const semver1 = Semver.ofString("1.2.3");
const semver2 = Semver.ofString("1.2.4");
const semver3 = Semver.ofString("1.2.3");
assertEquals(semver1.gt(semver2), false);
assertEquals(semver1.gt(semver3), false);
})
Deno.test("lt より小さい時はtrueを返す", () => {
const semver1 = Semver.ofString("1.2.3");
const semver2 = Semver.ofString("1.2.4");
const semver3 = Semver.ofString("2.2.4");
assert(semver1.lt(semver2));
assert(semver2.lt(semver3));
})
Deno.test("lt より小さくない時はfalseを返す", () => {
const semver1 = Semver.ofString("1.2.3");
const semver2 = Semver.ofString("1.2.4");
const semver3 = Semver.ofString("1.2.3");
assertEquals(semver2.lt(semver1), false);
assertEquals(semver3.lt(semver1), false);
})
Deno.test("gte 以上の時はtrue そうでない時false", () => {
const semver1 = Semver.ofString("1.2.3");
const semver2 = Semver.ofString("1.2.4");
const semver3 = Semver.ofString("1.2.3");
assert(semver2.gte(semver1));
assert(semver3.gte(semver1));
assertEquals(semver1.gte(semver2), false);
})
Deno.test("lte 以上の時はtrue そうでない時false", () => {
const semver1 = Semver.ofString("1.2.3");
const semver2 = Semver.ofString("1.2.4");
const semver3 = Semver.ofString("1.2.3");
assert(semver1.lte(semver2));
assert(semver1.lte(semver3));
assertEquals(semver2.lte(semver1), false);
})
Deno.test("eq 同値の時trueを返す", () => {
const semver1 = Semver.ofString("1.2.3");
const semver2 = Semver.ofString("1.2.3");
assert(semver1.eq(semver2));
});
Deno.test("eq 同値ではない時falseを返す", () => {
const semver1 = Semver.ofString("1.2.3");
const semver2 = Semver.ofString("1.2.4");
const semver3 = Semver.ofString("1.3.3");
const semver4 = Semver.ofString("2.2.3");
assertEquals(semver1.eq(semver2), false);
assertEquals(semver1.eq(semver3), false);
assertEquals(semver1.eq(semver4), false);
});
export interface IVersion<T extends IVersion<T>> {
// greater than
gt(other: T): boolean;
// greater than or equals
gte(other: T): boolean;
// less than
lt(other: T): boolean;
// less than or equals
lte(other: T): boolean;
// equals
eq(other: T): boolean;
}
export class Semver implements IVersion<Semver> {
private mager: number;
private minor: number;
private patch: number;
private constructor(mager: number, minor: number, patch: number) {
this.mager = mager;
this.minor = minor;
this.patch = patch;
}
public static ofString(str: string): Semver {
const versions: string[] = str.split(".");
if (versions === undefined || versions.length !== 3) {
throw Error("Invalid parameter");
}
return new Semver(
Number.parseInt(versions[0]),
Number.parseInt(versions[1]),
Number.parseInt(versions[2]),
);
}
gt(other: Semver): boolean {
if (this.mager > other.mager) {
return true;
}
if (this.minor > other.minor) {
return true;
}
return this.patch > other.patch;
}
gte(other: Semver): boolean {
if (this.gt(other)) {
return true;
}
return this.eq(other);
}
lt(other: Semver): boolean {
if (this.mager < other.mager) {
return true;
}
if (this.minor < other.minor) {
return true;
}
return this.patch < other.patch;
}
lte(other: Semver): boolean {
if (this.lt(other)) {
return true;
}
return this.eq(other);
}
eq(other: Semver): boolean {
return this.mager == other.mager &&
this.minor == other.minor &&
this.patch == other.patch;
}
}
@yoshixmk
Copy link
Author

yoshixmk commented Jun 4, 2020

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment