diff --git a/openapi-diff/src/modeler/AutoRest.Swagger.Tests/Resource/Swagger/invalid_swagger_specification.json b/openapi-diff/src/modeler/AutoRest.Swagger.Tests/Resource/Swagger/invalid_swagger_specification.json
new file mode 100644
index 00000000..de30fd82
--- /dev/null
+++ b/openapi-diff/src/modeler/AutoRest.Swagger.Tests/Resource/Swagger/invalid_swagger_specification.json
@@ -0,0 +1,3 @@
+{
+ "invalid_swagger_specification"
+}
\ No newline at end of file
diff --git a/openapi-diff/src/modeler/AutoRest.Swagger.Tests/Resource/Swagger/swagger_specification.json b/openapi-diff/src/modeler/AutoRest.Swagger.Tests/Resource/Swagger/swagger_specification.json
new file mode 100644
index 00000000..d97c16dc
--- /dev/null
+++ b/openapi-diff/src/modeler/AutoRest.Swagger.Tests/Resource/Swagger/swagger_specification.json
@@ -0,0 +1,257 @@
+{
+ "swagger": "2.0",
+ "info": {
+ "contact": {
+ "email": "apiteam@swagger.io",
+ "name": "Swagger API Team",
+ "url": "http://swagger.io"
+ },
+ "description": "A sample API that uses a petstore as an example to demonstrate features in the Swagger 2.0 specification",
+ "license": {
+ "name": "Apache 2.0",
+ "url": "https://www.apache.org/licenses/LICENSE-2.0.html"
+ },
+ "termsOfService": "http://swagger.io/terms/",
+ "title": "Swagger Petstore",
+ "version": "1.0.0"
+ },
+ "host": "petstore.swagger.io",
+ "basePath": "/api",
+ "schemes": [
+ "http"
+ ],
+ "paths": {
+ "/pets": {
+ "get": {
+ "produces": [
+ "application/json"
+ ],
+ "parameters": [
+ {
+ "collectionFormat": "multi",
+ "description": "tags to filter by",
+ "in": "query",
+ "items": {
+ "type": "string"
+ },
+ "name": "tags",
+ "required": false,
+ "type": "array"
+ },
+ {
+ "description": "maximum number of results to return",
+ "format": "int32",
+ "in": "query",
+ "name": "limit",
+ "required": false,
+ "type": "integer"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "pet response",
+ "schema": {
+ "items": {
+ "$ref": "#/definitions/Pet"
+ },
+ "type": "array"
+ }
+ },
+ "default": {
+ "description": "unexpected error",
+ "schema": {
+ "$ref": "#/definitions/Error"
+ }
+ }
+ },
+ "description": "Returns all pets from the system that the user has access to the system",
+ "operationId": "findPets"
+ },
+ "post": {
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "parameters": [
+ {
+ "description": "Pet to add to the store",
+ "in": "body",
+ "name": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/NewPet"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "pet response",
+ "schema": {
+ "$ref": "#/definitions/Pet"
+ }
+ },
+ "default": {
+ "description": "unexpected error",
+ "schema": {
+ "$ref": "#/definitions/Error"
+ }
+ }
+ },
+ "description": "Creates a new pet in the store. Duplicates are allowed",
+ "operationId": "addPet"
+ }
+ },
+ "/pets/{id}": {
+ "delete": {
+ "produces": [
+ "application/json"
+ ],
+ "parameters": [
+ {
+ "description": "ID of pet to delete",
+ "format": "int64",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "type": "integer"
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "pet deleted"
+ },
+ "default": {
+ "description": "unexpected error",
+ "schema": {
+ "$ref": "#/definitions/Error"
+ }
+ }
+ },
+ "description": "deletes a single pet based on the ID supplied",
+ "operationId": "deletePet"
+ },
+ "get": {
+ "produces": [
+ "application/json"
+ ],
+ "parameters": [
+ {
+ "description": "ID of pet to fetch",
+ "format": "int64",
+ "in": "path",
+ "name": "id",
+ "required": true,
+ "type": "integer"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "pet response",
+ "schema": {
+ "$ref": "#/definitions/Pet"
+ }
+ },
+ "default": {
+ "description": "unexpected error",
+ "schema": {
+ "$ref": "#/definitions/Error"
+ }
+ }
+ },
+ "description": "Returns a user based on a single ID, if the user does not have access to the pet",
+ "operationId": "find pet by id"
+ }
+ }
+ },
+ "definitions": {
+ "Error": {
+ "properties": {
+ "code": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "message": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "code",
+ "message"
+ ],
+ "type": "object"
+ },
+ "NewPet": {
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "tag": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name"
+ ],
+ "type": "object"
+ },
+ "Pet": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/NewPet"
+ },
+ {
+ "properties": {
+ "id": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "petType": {
+ "$ref": "#/definitions/PetType"
+ }
+ },
+ "required": [
+ "id"
+ ],
+ "type": "object"
+ }
+ ]
+ },
+ "PetType": {
+ "enum": [
+ "Mammals",
+ "Fish",
+ "Birds",
+ "Reptiles",
+ "Amphibians",
+ "Invertebrates"
+ ],
+ "type": "string",
+ "x-ms-enum": {
+ "name": "PetType",
+ "modelAsString": false,
+ "values": [
+ {
+ "value": 0,
+ "description": "humans and all other animals that are warm-blooded vertebrates",
+ "name": "Mammals"
+ },
+ {
+ "value": 1,
+ "description": "aquatic, craniate, gill-bearing animals that lack limbs with digits"
+ },
+ {
+ "value": 2,
+ "name": "Birds"
+ },
+ 3,
+ 4,
+ 5
+ ],
+ "x-nullable": false
+ }
+ }
+ },
+ "x-components": {}
+}
\ No newline at end of file
diff --git a/openapi-diff/src/modeler/AutoRest.Swagger.Tests/SwaggerParserTests.cs b/openapi-diff/src/modeler/AutoRest.Swagger.Tests/SwaggerParserTests.cs
new file mode 100644
index 00000000..5632afed
--- /dev/null
+++ b/openapi-diff/src/modeler/AutoRest.Swagger.Tests/SwaggerParserTests.cs
@@ -0,0 +1,48 @@
+using System.Reflection;
+
+using System.IO;
+using AutoRest.Swagger.Model;
+using Newtonsoft.Json;
+using Xunit;
+using OpenApiDiff.Core;
+
+namespace AutoRest.Swagger.UTest
+{
+ ///
+ /// This class contains tests about the swagger parser
+ ///
+ [Collection("Comparison Tests")]
+ public class SwaggerParserTest
+ {
+ private static string ReadSwaggerFile(string fileName)
+ {
+ var baseDir = Directory.GetParent(typeof(SwaggerParserTest).GetTypeInfo().Assembly.Location)
+ .ToString();
+ var filePath = Path.Combine(baseDir, "Resource", "Swagger", fileName);
+ return File.ReadAllText(filePath);
+ }
+
+ ///
+ /// Verifies that the Parser throws an Exception when an in valid json is given
+ ///
+ [Fact]
+ public void SwaggerParser_Should_Throw_Exception_When_Invalid_Json()
+ {
+ const string fileName = "invalid_swagger_specification.json";
+ var documentAsString = ReadSwaggerFile(fileName);
+ Assert.Throws(() => SwaggerParser.Parse(documentAsString, fileName));
+ }
+
+ ///
+ /// Verifies that a valid JsonDocument object is parsed when input is a valid Swagger
+ ///
+ [Fact]
+ public void SwaggerParser_Should_Return_Valid_Swagger_Document_Object()
+ {
+ const string fileName = "swagger_specification.json";
+ var documentAsString = ReadSwaggerFile(fileName);
+ var validSwaggerDocument = SwaggerParser.Parse(documentAsString, fileName);
+ Assert.IsType>(validSwaggerDocument);
+ }
+ }
+}
\ No newline at end of file
diff --git a/openapi-diff/src/modeler/AutoRest.Swagger/Model/XmsEnumExtension.cs b/openapi-diff/src/modeler/AutoRest.Swagger/Model/XmsEnumExtension.cs
index 7a5cac8d..6bff9174 100644
--- a/openapi-diff/src/modeler/AutoRest.Swagger/Model/XmsEnumExtension.cs
+++ b/openapi-diff/src/modeler/AutoRest.Swagger/Model/XmsEnumExtension.cs
@@ -7,22 +7,30 @@
namespace AutoRest.Swagger.Model
{
///
- /// The object provides metadata about the API.
- /// The metadata can be used by the clients if needed, and can be presented
+ /// The object provides metadata about the API.
+ /// The metadata can be used by the clients if needed, and can be presented
/// in the Swagger-UI for convenience.
///
-
+
public class XmsEnumValue
{
public dynamic value;
public string description;
public string name;
+ public XmsEnumValue(dynamic v)
+ {
+ value = v;
+ }
+
+ public static explicit operator XmsEnumValue(int v) => new XmsEnumValue(v);
+ public static explicit operator XmsEnumValue(long v) => new XmsEnumValue(v);
+ public static explicit operator XmsEnumValue(string v) => new XmsEnumValue(v);
}
- public class XmsEnumExtension
+ public class XmsEnumExtension
{
public string Name { get; set; }
-
+
public Boolean ModelAsString { get; set; }
public IList values { get; set; }