github.com/readium/readium-lcp-server@v0.0.0-20240509124024-799e77a0bbd6/rwpm/w3cpublication_test.go (about)

     1  // Copyright 2020 Readium Foundation. All rights reserved.
     2  // Use of this source code is governed by a BSD-style license
     3  // that can be found in the LICENSE file exposed on Github (readium) in the project repository.
     4  
     5  package rwpm
     6  
     7  import (
     8  	"encoding/json"
     9  	"testing"
    10  )
    11  
    12  type W3CmultiLanguageStruct struct {
    13  	Ml W3CMultiLanguage `json:"ml"`
    14  }
    15  
    16  func TestW3CMultiLanguage(t *testing.T) {
    17  	var obj W3CmultiLanguageStruct
    18  
    19  	// case = the property has a literal value
    20  	const single = `{"ml":"literal"}`
    21  	if err := json.Unmarshal([]byte(single), &obj); err != nil {
    22  		t.Fatal(err)
    23  	} else {
    24  		if obj.Ml.Text() != "literal" {
    25  			t.Errorf("Expected one value named 'literal', got %#v", obj.Ml)
    26  		}
    27  	}
    28  	jstring, err := json.Marshal(obj)
    29  	if err != nil {
    30  		t.Fatal(err)
    31  	}
    32  	if string(jstring) != single {
    33  		t.Errorf("Expected string equality, got %#v", string(jstring))
    34  	}
    35  
    36  	// case = the property has a structured localized value
    37  	const objectLoc = `{"ml":{"language":"fr","value":"nom","direction":"ltr"}}`
    38  	if err := json.Unmarshal([]byte(objectLoc), &obj); err != nil {
    39  		t.Fatal(err)
    40  	} else {
    41  		if obj.Ml[0].Value != "nom" {
    42  			t.Errorf("Expected one value named 'nom', got %#v", obj.Ml[0].Value)
    43  		}
    44  	}
    45  	jstring, err = json.Marshal(obj)
    46  	if err != nil {
    47  		t.Fatal(err)
    48  	}
    49  	if string(jstring) != objectLoc {
    50  		t.Errorf("Expected string equality, got %#v", string(jstring))
    51  	}
    52  
    53  	// case = the property has multiple localized values
    54  	const multiple = `{"ml":[{"language":"fr","value":"nom","direction":"ltr"},{"language":"en","value":"name","direction":"ltr"},"other name"]}`
    55  	if err := json.Unmarshal([]byte(multiple), &obj); err != nil {
    56  		t.Fatal(err)
    57  	} else {
    58  		if obj.Ml[0].Value != "nom" {
    59  			t.Errorf("Expected one value named 'nom', got %#v", obj.Ml[0].Value)
    60  		}
    61  	}
    62  	jstring, err = json.Marshal(obj)
    63  	if err != nil {
    64  		t.Fatal(err)
    65  	}
    66  	if string(jstring) != multiple {
    67  		t.Errorf("Expected string equality, got %#v", string(jstring))
    68  	}
    69  }
    70  
    71  type linkStruct struct {
    72  	Lnk W3CLinks `json:"links"`
    73  }
    74  
    75  func TestW3CLinks(t *testing.T) {
    76  	var obj linkStruct
    77  
    78  	// literal value
    79  	const singleText = `{"links":"single"}`
    80  	if err := json.Unmarshal([]byte(singleText), &obj); err != nil {
    81  		t.Fatal(err)
    82  	} else {
    83  		if len(obj.Lnk) != 1 || obj.Lnk[0].URL != "single" {
    84  			t.Errorf("Expected one link named single, got %#v", obj.Lnk)
    85  		}
    86  	}
    87  	// check  MarshalJSON
    88  	jstring, err := json.Marshal(obj)
    89  	if err != nil {
    90  		t.Fatal(err)
    91  	}
    92  	if string(jstring) != singleText {
    93  		t.Errorf("Expected string equality, got %#v", string(jstring))
    94  	}
    95  
    96  	// array of literal values
    97  	const arrayOfText = `{"links":["single","double"]}`
    98  	if err := json.Unmarshal([]byte(arrayOfText), &obj); err != nil {
    99  		t.Fatal(err)
   100  	} else {
   101  		if len(obj.Lnk) != 2 || obj.Lnk[0].URL != "single" || obj.Lnk[1].URL != "double" {
   102  			t.Errorf("Expected 2 links named single and double, got %#v", obj.Lnk)
   103  		}
   104  	}
   105  	// check MarshalJSON
   106  	jstring, err = json.Marshal(obj)
   107  	if err != nil {
   108  		t.Fatal(err)
   109  	}
   110  	if string(jstring) != arrayOfText {
   111  		t.Errorf("Expected string equality, got %#v", string(jstring))
   112  	}
   113  
   114  	// struct value
   115  	const singleObject = `{"links":{"url":"linkurl","name":"linkname","rel":"relation"}}`
   116  	if err := json.Unmarshal([]byte(singleObject), &obj); err != nil {
   117  		t.Fatal(err)
   118  	} else {
   119  		if len(obj.Lnk) != 1 || obj.Lnk[0].URL != "linkurl" || obj.Lnk[0].Rel.Text() != "relation" || obj.Lnk[0].Name.Text() != "linkname" {
   120  			t.Errorf("Expected 1 link named linkurl, got %#v", obj.Lnk)
   121  		}
   122  	}
   123  	// check MarshalJSON
   124  	jstring, err = json.Marshal(obj)
   125  	if err != nil {
   126  		t.Fatal(err)
   127  	}
   128  	if string(jstring) != singleObject {
   129  		t.Errorf("Expected string equality, got %#v", string(jstring))
   130  	}
   131  
   132  }